40 if (wires[idx] != w && !wires[idx]->port_output)
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()) {
140 std::vector<int> inverse_in_vec = ez.vec_not(in_vec);
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()) {
190 std::vector<int> inverse_in_vec = ez.vec_not(in_vec);
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]) {
251 log(
" test_abcloop [options]\n");
253 log(
"Test handling of logic loops in ABC.\n");
255 log(
" -n {integer}\n");
256 log(
" create this number of circuits and test them (default = 100).\n");
258 log(
" -s {positive_integer}\n");
259 log(
" use this value as rng seed value (default = unix time).\n");
268 for (argidx = 1; argidx <
GetSize(args); argidx++)
270 if (args[argidx] ==
"-n" && argidx+1 <
GetSize(args)) {
271 num_iter = atoi(args[++argidx].c_str());
274 if (args[argidx] ==
"-s" && argidx+1 <
GetSize(args)) {
284 for (
int i = 0; i < num_iter; i++)
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)
TestAbcloopPass TestAbcloopPass
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 std::string idx(std::string str)
std::vector< int > importSigSpec(RTLIL::SigSpec sig, int timestep=-1)
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)
#define PRIVATE_NAMESPACE_BEGIN
int GetSize(RTLIL::Wire *wire)
#define log_assert(_assert_expr_)
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
#define PRIVATE_NAMESPACE_END
virtual void execute(std::vector< std::string > args, RTLIL::Design *)
RTLIL::Module * addModule(RTLIL::IdString name)
#define USING_YOSYS_NAMESPACE
RTLIL::ObjRange< RTLIL::Cell * > cells()
static void test_abcloop()
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)
bool importCell(RTLIL::Cell *cell, int timestep=-1)
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)