Skip to content

Commit 42021a1

Browse files
committed
Further refactoring
1 parent 6b6fe7d commit 42021a1

File tree

9 files changed

+735
-286
lines changed

9 files changed

+735
-286
lines changed

CMakeLists.txt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,25 @@ find_package(Boost REQUIRED random)
2222
# Knor itself
2323
add_executable(knor)
2424
target_sources(knor
25-
PRIVATE
26-
src/aigcircuit.cpp
27-
src/aiger.c
28-
src/abcminimization.cpp
29-
src/aigencoder.cpp
30-
src/bddtools.cpp
31-
src/bisim.cpp
32-
src/explicitgame.cpp
33-
src/knor.cpp
34-
src/simplehoa.c
35-
src/symgame.cpp
36-
${BISON_hoaparser_OUTPUTS}
37-
${FLEX_hoalexer_OUTPUTS}
25+
PRIVATE
26+
src/aigcircuit.cpp
27+
src/aiger.c
28+
src/abcminimization.cpp
29+
src/aigencoder.cpp
30+
src/bddtools.cpp
31+
src/bisim.cpp
32+
src/gameconstructor.cpp
33+
src/knor.cpp
34+
src/simplehoa.c
35+
src/symgame.cpp
36+
${BISON_hoaparser_OUTPUTS}
37+
${FLEX_hoalexer_OUTPUTS}
3838
)
3939
target_compile_features(knor PUBLIC c_std_11 cxx_std_17)
4040
target_compile_options(knor PRIVATE -Wall -Wextra -fno-strict-aliasing -Wno-deprecated -Wno-unused-parameter)
4141
target_link_libraries(knor PRIVATE oink::oink sylvan::sylvan libabc)
4242
target_link_libraries(knor PRIVATE Boost::boost)
4343
if(CMAKE_HOST_SYSTEM MATCHES Linux)
44-
target_link_libraries(knor PRIVATE "-static")
44+
target_link_libraries(knor PRIVATE "-static")
4545
endif()
4646
target_include_directories(knor PRIVATE src)

src/aigencoder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ AIGEncoder::processSOP()
374374
states_vec.push_back(state);
375375

376376
// encode state using NS vars
377-
cap_bdd = SymGame::encode_state(state, game.ns_vars);
377+
cap_bdd = BDDTools::encode_state(state, game.ns_vars);
378378
// keep s > u of this state
379379
cap_bdd = sylvan_and_exists(full, cap_bdd, game.ns_vars);
380380

@@ -599,7 +599,7 @@ void AIGEncoder::processOnehot()
599599
}
600600

601601
// encode state using NS vars
602-
cap_bdd = SymGame::encode_state(state, game.ns_vars);
602+
cap_bdd = BDDTools::encode_state(state, game.ns_vars);
603603
// keep s > u of this state
604604
cap_bdd = sylvan_and_exists(full, cap_bdd, game.ns_vars);
605605

src/bddtools.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,79 @@ MTBDD BDDTools::pathsToSubroot(MTBDD root, uint32_t firstVar, MTBDD subroot)
5656
{
5757
return RUN(paths_to_subroot, root, firstVar, subroot);
5858
}
59+
60+
/**
61+
* Encode a state as a BDD, using statebits 0..<statebits>, offsetted by <offset>+<priobits>
62+
* High-significant bits come before low-significant bits in the BDD
63+
*/
64+
MTBDD BDDTools::encode_state(uint32_t state, MTBDD statevars)
65+
{
66+
// convert statevars to stack
67+
std::vector<unsigned int> vars;
68+
while (statevars != mtbdd_set_empty()) {
69+
vars.push_back(mtbdd_set_first(statevars));
70+
statevars = mtbdd_set_next(statevars);
71+
}
72+
// create a cube
73+
auto cube = mtbdd_true;
74+
while (!vars.empty()) {
75+
auto var = vars.back();
76+
vars.pop_back();
77+
if (state & 1) cube = mtbdd_makenode(var, mtbdd_false, cube);
78+
else cube = mtbdd_makenode(var, cube, mtbdd_false);
79+
state >>= 1;
80+
}
81+
return cube;
82+
}
83+
84+
/**
85+
* Encode priority i.e. all states via priority <priority>
86+
*/
87+
MTBDD BDDTools::encode_prio(int priority, int priobits)
88+
{
89+
MTBDD cube = mtbdd_true;
90+
for (int i=0; i<priobits; i++) {
91+
if (priority & 1) cube = mtbdd_makenode(priobits-i-1, mtbdd_false, cube);
92+
else cube = mtbdd_makenode(priobits-i-1, cube, mtbdd_false);
93+
priority >>= 1;
94+
}
95+
return cube;
96+
}
97+
98+
99+
/**
100+
* Encode a priostate as a BDD, with priobits before statebits
101+
* High-significant bits come before low-significant bits in the BDD
102+
*/
103+
MTBDD BDDTools::encode_priostate(uint32_t state, uint32_t priority, MTBDD statevars, MTBDD priovars)
104+
{
105+
// convert statevars to stack
106+
std::vector<unsigned int> vars;
107+
while (statevars != mtbdd_set_empty()) {
108+
vars.push_back(mtbdd_set_first(statevars));
109+
statevars = mtbdd_set_next(statevars);
110+
}
111+
// create the cube
112+
auto cube = mtbdd_true;
113+
while (!vars.empty()) {
114+
auto var = vars.back();
115+
vars.pop_back();
116+
if (state & 1) cube = mtbdd_makenode(var, mtbdd_false, cube);
117+
else cube = mtbdd_makenode(var, cube, mtbdd_false);
118+
state >>= 1;
119+
}
120+
// convert priovars to stack
121+
while (priovars != mtbdd_set_empty()) {
122+
vars.push_back(mtbdd_set_first(priovars));
123+
priovars = mtbdd_set_next(priovars);
124+
}
125+
// create the rest of the cube
126+
while (!vars.empty()) {
127+
auto var = vars.back();
128+
vars.pop_back();
129+
if (priority & 1) cube = mtbdd_makenode(var, mtbdd_false, cube);
130+
else cube = mtbdd_makenode(var, cube, mtbdd_false);
131+
priority >>= 1;
132+
}
133+
return cube;
134+
}

src/bddtools.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ class BDDTools {
3232
* @return a BDD with all paths to the given subroot.
3333
*/
3434
static sylvan::MTBDD pathsToSubroot(sylvan::MTBDD root, uint32_t firstVar, sylvan::MTBDD subroot);
35+
36+
/**
37+
* Encode a priostate as a BDD, using priobits before statebits
38+
* High-significant bits come before low-significant bits in the BDD
39+
*/
40+
static sylvan::MTBDD encode_priostate(uint32_t state, uint32_t priority, sylvan::MTBDD statevars, sylvan::MTBDD priovars);
41+
42+
/**
43+
* Encode a state as a BDD, using statebits 0..<statebits>, offsetted by <offset>+<priobits>
44+
* High-significant bits come before low-significant bits in the BDD
45+
*/
46+
static sylvan::MTBDD encode_state(uint32_t state, sylvan::MTBDD state_vars);
47+
48+
/**
49+
* Encode priority i.e. all states via priority <priority>
50+
*/
51+
static sylvan::MTBDD encode_prio(int priority, int priobits);
52+
3553
};
3654

3755
#endif //KNOR_BDDTOOLS_HPP

0 commit comments

Comments
 (0)