summaryrefslogtreecommitdiff
path: root/passes
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2016-01-06 13:54:00 +0100
committerClifford Wolf <clifford@clifford.at>2016-01-06 13:54:00 +0100
commit1f8c47fb47e9d15808e66e423827598bb1050411 (patch)
tree8971ba0333a746ef1f79a362228b58121bef1279 /passes
parent1d62f8710f04fec405ef79b9e9a4a031afcf7d42 (diff)
Added "equiv_add -try" mode
Diffstat (limited to 'passes')
-rw-r--r--passes/equiv/equiv_add.cc39
1 files changed, 33 insertions, 6 deletions
diff --git a/passes/equiv/equiv_add.cc b/passes/equiv/equiv_add.cc
index 9ae490fe..0494a724 100644
--- a/passes/equiv/equiv_add.cc
+++ b/passes/equiv/equiv_add.cc
@@ -29,34 +29,51 @@ struct EquivAddPass : public Pass {
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
- log(" equiv_add gold_sig gate_sig\n");
+ log(" equiv_add [-try] gold_sig gate_sig\n");
log("\n");
log("This command adds an $equiv cell for the specified signals.\n");
log("\n");
log("\n");
- log(" equiv_add -cell gold_cell gate_cell\n");
+ log(" equiv_add [-try] -cell gold_cell gate_cell\n");
log("\n");
log("This command adds $equiv cells for the ports of the specified cells.\n");
log("\n");
}
virtual void execute(std::vector<std::string> args, Design *design)
{
+ bool try_mode = false;
+
if (design->selected_active_module.empty())
log_cmd_error("This command must be executed in module context!\n");
Module *module = design->module(design->selected_active_module);
log_assert(module != nullptr);
+ if (GetSize(args) > 1 && args[1] == "-try") {
+ args.erase(args.begin() + 1);
+ try_mode = true;
+ }
+
if (GetSize(args) == 4 && args[1] == "-cell")
{
Cell *gold_cell = module->cell(RTLIL::escape_id(args[2]));
Cell *gate_cell = module->cell(RTLIL::escape_id(args[3]));
- if (gold_cell == nullptr)
+ if (gold_cell == nullptr) {
+ if (try_mode) {
+ log_warning("Can't find gold cell '%s'.\n", args[2].c_str());
+ return;
+ }
log_cmd_error("Can't find gold cell '%s'.\n", args[2].c_str());
+ }
- if (gate_cell == nullptr)
+ if (gate_cell == nullptr) {
+ if (try_mode) {
+ log_warning("Can't find gate cell '%s'.\n", args[3].c_str());
+ return;
+ }
log_cmd_error("Can't find gate cell '%s'.\n", args[3].c_str());
+ }
for (auto conn : gold_cell->connections())
{
@@ -107,11 +124,21 @@ struct EquivAddPass : public Pass {
SigSpec gold_signal, gate_signal;
- if (!SigSpec::parse(gate_signal, module, args[2]))
+ if (!SigSpec::parse(gate_signal, module, args[2])) {
+ if (try_mode) {
+ log_warning("Error in gate signal: %s\n", args[2].c_str());
+ return;
+ }
log_cmd_error("Error in gate signal: %s\n", args[2].c_str());
+ }
- if (!SigSpec::parse_rhs(gate_signal, gold_signal, module, args[1]))
+ if (!SigSpec::parse_rhs(gate_signal, gold_signal, module, args[1])) {
+ if (try_mode) {
+ log_warning("Error in gold signal: %s\n", args[1].c_str());
+ return;
+ }
log_cmd_error("Error in gold signal: %s\n", args[1].c_str());
+ }
log_assert(GetSize(gold_signal) == GetSize(gate_signal));
SigSpec equiv_signal = module->addWire(NEW_ID, GetSize(gold_signal));