Skip to content

Commit c9cd6a7

Browse files
committed
equiv_make: Add -assert option
This adds an -assert flag to equiv_make. When used, the pass generates $eqx and $assert cells to encode equivalence instead of $equiv, which means the equivalence check can be done with SymbiYosys.
1 parent 7407a7f commit c9cd6a7

File tree

1 file changed

+64
-29
lines changed

1 file changed

+64
-29
lines changed

passes/equiv/equiv_make.cc

+64-29
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct EquivMakeWorker
3333
bool inames;
3434
vector<string> blacklists;
3535
vector<string> encfiles;
36+
bool emit_assertions;
3637

3738
pool<IdString> blacklist_names;
3839
dict<IdString, dict<Const, Const>> encdata;
@@ -143,6 +144,12 @@ struct EquivMakeWorker
143144
delete gate_clone;
144145
}
145146

147+
void add_eq_assertion(IdString sig_id, const SigSpec &gold_sig, const SigSpec &gate_sig)
148+
{
149+
auto eq_wire = equiv_mod->Eqx(NEW_ID, gold_sig, gate_sig);
150+
equiv_mod->addAssert(NEW_ID, eq_wire, State::S1, "$equiv_make$assert:" + sig_id.str());
151+
}
152+
146153
void find_same_wires()
147154
{
148155
SigMap assign_map(equiv_mod);
@@ -240,18 +247,25 @@ struct EquivMakeWorker
240247

241248
if (gold_wire->port_output || gate_wire->port_output)
242249
{
243-
Wire *wire = equiv_mod->addWire(id, gold_wire->width);
244-
wire->port_output = true;
245250
gold_wire->port_input = false;
246251
gate_wire->port_input = false;
247252
gold_wire->port_output = false;
248253
gate_wire->port_output = false;
249254

250-
for (int i = 0; i < wire->width; i++)
251-
equiv_mod->addEquiv(NEW_ID, SigSpec(gold_wire, i), SigSpec(gate_wire, i), SigSpec(wire, i));
255+
if (emit_assertions)
256+
add_eq_assertion(id, gold_wire, gate_wire);
257+
258+
else
259+
{
260+
Wire *wire = equiv_mod->addWire(id, gold_wire->width);
261+
wire->port_output = true;
262+
263+
for (int i = 0; i < wire->width; i++)
264+
equiv_mod->addEquiv(NEW_ID, SigSpec(gold_wire, i), SigSpec(gate_wire, i), SigSpec(wire, i));
252265

253-
rd_signal_map.add(assign_map(gold_wire), wire);
254-
rd_signal_map.add(assign_map(gate_wire), wire);
266+
rd_signal_map.add(assign_map(gold_wire), wire);
267+
rd_signal_map.add(assign_map(gate_wire), wire);
268+
}
255269
}
256270
else
257271
if (gold_wire->port_input || gate_wire->port_input)
@@ -265,26 +279,31 @@ struct EquivMakeWorker
265279
}
266280
else
267281
{
268-
Wire *wire = equiv_mod->addWire(id, gold_wire->width);
269-
SigSpec rdmap_gold, rdmap_gate, rdmap_equiv;
282+
if (emit_assertions)
283+
add_eq_assertion(id, gold_wire, gate_wire);
270284

271-
for (int i = 0; i < wire->width; i++) {
272-
if (undriven_bits.count(assign_map(SigBit(gold_wire, i)))) {
273-
log(" Skipping signal bit %s [%d]: undriven on gold side.\n", id2cstr(gold_wire->name), i);
274-
continue;
275-
}
276-
if (undriven_bits.count(assign_map(SigBit(gate_wire, i)))) {
277-
log(" Skipping signal bit %s [%d]: undriven on gate side.\n", id2cstr(gate_wire->name), i);
278-
continue;
285+
else {
286+
Wire *wire = equiv_mod->addWire(id, gold_wire->width);
287+
SigSpec rdmap_gold, rdmap_gate, rdmap_equiv;
288+
289+
for (int i = 0; i < wire->width; i++) {
290+
if (undriven_bits.count(assign_map(SigBit(gold_wire, i)))) {
291+
log(" Skipping signal bit %s [%d]: undriven on gold side.\n", id2cstr(gold_wire->name), i);
292+
continue;
293+
}
294+
if (undriven_bits.count(assign_map(SigBit(gate_wire, i)))) {
295+
log(" Skipping signal bit %s [%d]: undriven on gate side.\n", id2cstr(gate_wire->name), i);
296+
continue;
297+
}
298+
equiv_mod->addEquiv(NEW_ID, SigSpec(gold_wire, i), SigSpec(gate_wire, i), SigSpec(wire, i));
299+
rdmap_gold.append(SigBit(gold_wire, i));
300+
rdmap_gate.append(SigBit(gate_wire, i));
301+
rdmap_equiv.append(SigBit(wire, i));
279302
}
280-
equiv_mod->addEquiv(NEW_ID, SigSpec(gold_wire, i), SigSpec(gate_wire, i), SigSpec(wire, i));
281-
rdmap_gold.append(SigBit(gold_wire, i));
282-
rdmap_gate.append(SigBit(gate_wire, i));
283-
rdmap_equiv.append(SigBit(wire, i));
284-
}
285303

286-
rd_signal_map.add(rdmap_gold, rdmap_equiv);
287-
rd_signal_map.add(rdmap_gate, rdmap_equiv);
304+
rd_signal_map.add(rdmap_gold, rdmap_equiv);
305+
rd_signal_map.add(rdmap_gate, rdmap_equiv);
306+
}
288307
}
289308
}
290309

@@ -353,12 +372,20 @@ struct EquivMakeWorker
353372
continue;
354373
}
355374

356-
for (int i = 0; i < GetSize(gold_sig); i++)
357-
if (gold_sig[i] != gate_sig[i]) {
358-
Wire *w = equiv_mod->addWire(NEW_ID);
359-
equiv_mod->addEquiv(NEW_ID, gold_sig[i], gate_sig[i], w);
360-
gold_sig[i] = w;
361-
}
375+
if (emit_assertions)
376+
{
377+
if (gold_sig != gate_sig)
378+
add_eq_assertion(id, gold_sig, gate_sig);
379+
}
380+
else
381+
{
382+
for (int i = 0; i < GetSize(gold_sig); i++)
383+
if (gold_sig[i] != gate_sig[i]) {
384+
Wire *w = equiv_mod->addWire(NEW_ID);
385+
equiv_mod->addEquiv(NEW_ID, gold_sig[i], gate_sig[i], w);
386+
gold_sig[i] = w;
387+
}
388+
}
362389

363390
gold_cell->setPort(gold_conn.first, gold_sig);
364391
}
@@ -486,6 +513,9 @@ struct EquivMakePass : public Pass {
486513
log(" Match FSM encodings using the description from the file.\n");
487514
log(" See 'help fsm_recode' for details.\n");
488515
log("\n");
516+
log(" -assert\n");
517+
log(" Create $eqx and $assert cells to encode equivalence instead of $equiv.\n");
518+
log("\n");
489519
log("Note: The circuit created by this command is not a miter (with something like\n");
490520
log("a trigger output), but instead uses $equiv cells to encode the equivalence\n");
491521
log("checking problem. Use 'miter -equiv' if you want to create a miter circuit.\n");
@@ -496,6 +526,7 @@ struct EquivMakePass : public Pass {
496526
EquivMakeWorker worker;
497527
worker.ct.setup(design);
498528
worker.inames = false;
529+
worker.emit_assertions = false;
499530

500531
size_t argidx;
501532
for (argidx = 1; argidx < args.size(); argidx++)
@@ -512,6 +543,10 @@ struct EquivMakePass : public Pass {
512543
worker.encfiles.push_back(args[++argidx]);
513544
continue;
514545
}
546+
if (args[argidx] == "-assert") {
547+
worker.emit_assertions = true;
548+
continue;
549+
}
515550
break;
516551
}
517552

0 commit comments

Comments
 (0)