aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEddie Hung <eddie@fpgeh.com>2019-11-22 17:24:45 -0800
committerEddie Hung <eddie@fpgeh.com>2019-11-22 17:24:45 -0800
commit2c5dfd802d8323709a96993df4e2745c47d2905b (patch)
treeb54f1114cba6a2a5fefcebab2072d58b63153683
parent89a4a4d90f7d3229f69e80088531bf228dd500c6 (diff)
parent8119383f8198d621e88b54fdd615e352ecc576bb (diff)
downloadyosys-2c5dfd802d8323709a96993df4e2745c47d2905b.tar.gz
yosys-2c5dfd802d8323709a96993df4e2745c47d2905b.tar.bz2
yosys-2c5dfd802d8323709a96993df4e2745c47d2905b.zip
Merge remote-tracking branch 'origin/eddie/submod_po' into xaig_dff
-rw-r--r--passes/hierarchy/submod.cc12
-rw-r--r--tests/various/submod.ys28
2 files changed, 38 insertions, 2 deletions
diff --git a/passes/hierarchy/submod.cc b/passes/hierarchy/submod.cc
index 707bc26b3..a1fac9b79 100644
--- a/passes/hierarchy/submod.cc
+++ b/passes/hierarchy/submod.cc
@@ -33,7 +33,7 @@ struct SubmodWorker
CellTypes ct;
RTLIL::Design *design;
RTLIL::Module *module;
- pool<Wire*> outputs;
+ pool<Wire*> constants, outputs;
bool copy_mode;
std::string opt_name;
@@ -125,7 +125,7 @@ struct SubmodWorker
RTLIL::Wire *wire = it.first;
wire_flags_t &flags = it.second;
- if (wire->port_input)
+ if (wire->port_input || constants.count(wire))
flags.is_ext_driven = true;
if (wire->port_output || outputs.count(wire))
flags.is_ext_used = true;
@@ -235,6 +235,14 @@ struct SubmodWorker
outputs.insert(c.wire);
}
}
+ for (auto wire : module->wires()) {
+ auto sig = sigmap(wire);
+ for (auto c : sig.chunks()) {
+ if (c.wire)
+ continue;
+ constants.insert(wire);
+ }
+ }
if (opt_name.empty())
{
diff --git a/tests/various/submod.ys b/tests/various/submod.ys
index 271a8edef..a9d3fe672 100644
--- a/tests/various/submod.ys
+++ b/tests/various/submod.ys
@@ -23,3 +23,31 @@ design -import gate -as gate
miter -equiv -flatten -make_assert -make_outputs gold gate miter
sat -verify -prove-asserts -show-ports miter
+
+
+design -reset
+read_verilog <<EOT
+module top(input a, output [1:0] b);
+(* submod="bar" *) sub s1(a, b[1]);
+assign b[0] = 1'b0;
+endmodule
+
+module sub(input a, output c);
+assign c = a;
+endmodule
+EOT
+
+hierarchy -top top
+proc
+design -save gold
+
+submod
+dump
+flatten
+design -stash gate
+
+design -import gold -as gold
+design -import gate -as gate
+
+miter -equiv -flatten -make_assert -make_outputs gold gate miter
+sat -verify -prove-asserts -show-ports miter