54 int create_cycles = 0;
64 std::vector<RTLIL::Wire*> wires;
66 for (
int i = 0; i < 4; i++) {
73 for (
int i = 0; i < 4; i++) {
80 for (
int i = 0; i < 16; i++) {
132 SatGen satgen(&ez, &sigmap);
134 for (
auto c : module->
cells()) {
135 bool ok = satgen.importCell(c);
139 std::vector<int> in_vec = satgen.importSigSpec(in_sig);
140 std::vector<int> inverse_in_vec = ez.vec_not(in_vec);
142 std::vector<int> out_vec = satgen.importSigSpec(out_sig);
144 for (
int i = 0; i < 16; i++)
146 std::vector<int> assumptions;
147 for (
int j = 0; j <
GetSize(in_vec); j++)
148 assumptions.push_back((i & (1 << j)) ? in_vec.at(j) : inverse_in_vec.at(j));
150 std::vector<bool> results;
151 if (!ez.solve(out_vec, results, assumptions)) {
152 log(
"No stable solution for input %d found -> recreate module.\n", i);
153 goto recreate_module;
156 for (
int j = 0; j < 4; j++)
157 truthtab[i][j] = results[j];
159 assumptions.push_back(ez.vec_ne(out_vec, ez.vec_const(results)));
161 std::vector<bool> results2;
162 if (ez.solve(out_vec, results2, assumptions)) {
163 log(
"Two stable solutions for input %d found -> recreate module.\n", i);
164 goto recreate_module;
173 log(
"Found viable UUT after %d cycles:\n", create_cycles);
178 log(
"Pre- and post-abc truth table:\n");
182 SatGen satgen(&ez, &sigmap);
184 for (
auto c : module->
cells()) {
185 bool ok = satgen.importCell(c);
189 std::vector<int> in_vec = satgen.importSigSpec(in_sig);
190 std::vector<int> inverse_in_vec = ez.vec_not(in_vec);
192 std::vector<int> out_vec = satgen.importSigSpec(out_sig);
194 bool found_error =
false;
195 bool truthtab2[16][4];
197 for (
int i = 0; i < 16; i++)
199 std::vector<int> assumptions;
200 for (
int j = 0; j <
GetSize(in_vec); j++)
201 assumptions.push_back((i & (1 << j)) ? in_vec.at(j) : inverse_in_vec.at(j));
203 for (
int j = 0; j < 4; j++)
204 truthtab2[i][j] = truthtab[i][j];
206 std::vector<bool> results;
207 if (!ez.solve(out_vec, results, assumptions)) {
208 log(
"No stable solution for input %d found.\n", i);
213 for (
int j = 0; j < 4; j++)
214 truthtab2[i][j] = results[j];
216 assumptions.push_back(ez.vec_ne(out_vec, ez.vec_const(results)));
218 std::vector<bool> results2;
219 if (ez.solve(out_vec, results2, assumptions)) {
220 log(
"Two stable solutions for input %d found -> recreate module.\n", i);
225 for (
int i = 0; i < 16; i++) {
227 for (
int j = 0; j < 4; j++)
228 log(
"%c", truthtab[i][j] ?
'1' :
'0');
230 for (
int j = 0; j < 4; j++)
231 log(
"%c", truthtab2[i][j] ?
'1' :
'0');
232 for (
int j = 0; j < 4; j++)
233 if (truthtab[i][j] != truthtab2[i][j]) {
USING_YOSYS_NAMESPACE static PRIVATE_NAMESPACE_BEGIN uint32_t xorshift32_state
RTLIL::Cell * addXorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
std::string stringf(const char *fmt,...)
RTLIL::Cell * addNandGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
static RTLIL::Wire * getw(std::vector< RTLIL::Wire * > &wires, RTLIL::Wire *w)
RTLIL::Cell * addOai4Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y)
RTLIL::Cell * addAoi3Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y)
RTLIL::Cell * addNorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
static uint32_t xorshift32(uint32_t limit)
RTLIL::Cell * addNotGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_y)
YOSYS_NAMESPACE_BEGIN typedef ezMiniSAT ezDefaultSAT
RTLIL::Cell * addAndGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
RTLIL::Cell * addOrGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
int GetSize(RTLIL::Wire *wire)
#define log_assert(_assert_expr_)
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
RTLIL::Module * addModule(RTLIL::IdString name)
RTLIL::ObjRange< RTLIL::Cell * > cells()
void log(const char *format,...)
RTLIL::Cell * addAoi4Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y)
RTLIL::Cell * addMuxGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, RTLIL::SigBit sig_y)
void append(const RTLIL::SigSpec &signal)
RTLIL::Cell * addXnorGate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y)
void remove(RTLIL::Module *module)
static void call(RTLIL::Design *design, std::string command)
RTLIL::Cell * addOai3Gate(RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y)