ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
profile.c
Go to the documentation of this file.
1#include "global.h"
2
3#ifndef KISSAT_QUIET
4
5#include "internal.h"
6#include "resources.h"
7#include "sort.h"
8
9#include <stdio.h>
10#include <string.h>
11
12void kissat_init_profiles (profiles *profiles) {
13#define PROF(NAME, LEVEL) profiles->NAME = (profile){LEVEL, #NAME, 0, 0};
14 PROFS
15#undef PROF
16}
17
18#define SIZE_PROFS (sizeof (profiles) / sizeof (profile))
19
20static inline bool less_profile (profile *p, profile *q) {
21 if (p->time > q->time)
22 return true;
23 if (p->time < q->time)
24 return false;
25 return strcmp (p->name, q->name) < 0;
26}
27
28static void print_profile (kissat *solver, profile *p, double total) {
29 printf ("%s%14.2f %7.2f %% %s\n", solver->prefix, p->time,
30 kissat_percent (p->time, total), p->name);
31}
32
33static double flush_profile (profile *profile, double now) {
34 const double delta = now - profile->entered;
35 profile->time += delta;
36 profile->entered = now;
37 return delta;
38}
39
40static void flush_profiles (profiles *profiles, const double now) {
41 for (all_pointers (profile, p, profiles->stack))
42 flush_profile (p, now);
43}
44
45static void push_profile (kissat *solver, profile *profile, double now) {
46 profile->entered = now;
47 PUSH_STACK (solver->profiles.stack, profile);
48}
49
50void kissat_profiles_print (kissat *solver) {
51 profiles *named = &solver->profiles;
52 double now = kissat_process_time ();
53 flush_profiles (named, now);
54 profile *unsorted = (profile *) named;
55 profile *sorted[SIZE_PROFS];
56 const profile *const end = unsorted + SIZE_PROFS;
57 size_t size = 0;
58 for (profile *p = unsorted; p != end; p++)
59 if (p->level <= GET_OPTION (profile) &&
60 (p == &named->search || p == &named->simplify ||
61 (p != &named->total && p->time)))
62 sorted[size++] = p;
63 INSERTION_SORT (profile *, size, sorted, less_profile);
64 const double total = named->total.time;
65 for (size_t i = 0; i < size; i++)
66 print_profile (solver, sorted[i], total);
67 printf ("%s=============================================\n",
68 solver->prefix);
69 print_profile (solver, &named->total, total);
70}
71
72void kissat_start (kissat *solver, profile *profile) {
73 const double now = kissat_process_time ();
74 push_profile (solver, profile, now);
75}
76
77void kissat_stop (kissat *solver, profile *profile) {
78 KISSAT_assert (TOP_STACK (solver->profiles.stack) == profile);
79 (void) POP_STACK (solver->profiles.stack);
80 const double now = kissat_process_time ();
81 flush_profile (profile, now);
82}
83
84void kissat_stop_search_and_start_simplifier (kissat *solver,
85 profile *profile) {
86 struct profile *search = &PROFILE (search);
87 KISSAT_assert (search->level <= GET_OPTION (profile));
88 const double now = kissat_process_time ();
89 while (TOP_STACK (solver->profiles.stack) != search) {
90 struct profile *mode = POP_STACK (solver->profiles.stack);
91 KISSAT_assert (search->level <= mode->level);
92#ifndef KISSAT_NDEBUG
93 if (solver->stable)
94 KISSAT_assert (mode == &PROFILE (stable));
95 else
96 KISSAT_assert (mode == &PROFILE (focused));
97#endif
98 flush_profile (mode, now);
99 }
100 (void) POP_STACK (solver->profiles.stack);
101 struct profile *simplify = &PROFILE (simplify);
102 KISSAT_assert (search->level == simplify->level);
103 KISSAT_assert (simplify->level <= profile->level);
104 flush_profile (search, now);
105 push_profile (solver, simplify, now);
106 if (profile->level <= GET_OPTION (profile))
107 push_profile (solver, profile, now);
108}
109
110void kissat_stop_simplifier_and_resume_search (kissat *solver,
111 profile *profile) {
112 struct profile *simplify = &PROFILE (simplify);
113 struct profile *top = POP_STACK (solver->profiles.stack);
114 const double now = kissat_process_time ();
115 const double delta = flush_profile (simplify, now);
116#ifndef KISSAT_NDEBUG
117 const double entered = now - delta;
118 KISSAT_assert (solver->mode.entered <= entered);
119#endif
120 solver->mode.entered += delta;
121 if (top == profile) {
122 flush_profile (profile, now);
123 KISSAT_assert (TOP_STACK (solver->profiles.stack) == simplify);
124 (void) POP_STACK (solver->profiles.stack);
125 } else {
126 KISSAT_assert (simplify == top);
127 KISSAT_assert (profile->level > GET_OPTION (profile));
128 }
129#ifndef KISSAT_NDEBUG
130 struct profile *search = &PROFILE (search);
131 KISSAT_assert (search->level == simplify->level);
132#endif
133 KISSAT_assert (simplify->level <= profile->level);
134 push_profile (solver, &PROFILE (search), now);
135 struct profile *mode =
136 solver->stable ? &PROFILE (stable) : &PROFILE (focused);
137 KISSAT_assert (search->level <= mode->level);
138 if (mode->level <= GET_OPTION (profile))
139 push_profile (solver, mode, now);
140}
141
142double kissat_time (kissat *solver) {
143 const double now = kissat_process_time ();
144 flush_profiles (&solver->profiles, now);
145 return PROFILE (total).time;
146}
147
148#else
150#endif
#define POP_STACK(S)
Definition stack.h:37
#define all_pointers(T, E, S)
Definition stack.h:99
#define PUSH_STACK(S, E)
Definition stack.h:39
#define TOP_STACK(S)
Definition stack.h:27
pcover simplify(pcube *T)
Definition compl.c:566
Cube * p
Definition exorList.c:222
#define KISSAT_assert(ignore)
Definition global.h:13
#define INSERTION_SORT(TYPE, N, A, LESS)
Definition sort.h:97
#define solver
Definition kitten.c:211
unsigned long long size
Definition giaNewBdd.h:39
#define GET_OPTION(N)
Definition options.h:295
int kissat_profile_dummy_to_avoid_warning
Definition profile.c:149
Definition mode.h:11
int strcmp()