WIP: netlist compare - subcircuit matching enhanced.

This commit is contained in:
Matthias Koefferlein 2019-03-26 20:54:49 +01:00
parent 93d2341bc7
commit e0cb3f6303
1 changed files with 41 additions and 29 deletions

View File

@ -340,27 +340,26 @@ public:
// we cannot afford creating edges from all to all other pins, so we just create edges to the previous and next // we cannot afford creating edges from all to all other pins, so we just create edges to the previous and next
// pin. This may take more iterations to solve, but should be equivalent. // pin. This may take more iterations to solve, but should be equivalent.
// @@@ this is just pin_id + 1 or pin_id - 1!!! std::vector<size_t> pids;
db::Circuit::const_pin_iterator p = cr->begin_pins (); size_t pin_count = cr->pin_count ();
for ( ; p != cr->end_pins () && p->id () != pin_id; ++p)
;
tl_assert (p != cr->end_pins ());
db::Circuit::const_pin_iterator pp = p; // take the previous, next and second-next pin as targets for edges
if (pp == cr->begin_pins ()) { // (using the second-next pin avoid isolation of OUT vs. IN in case
pp = cr->end_pins (); // of a pin configuration of VSS-IN-VDD-OUT like for an inverter).
}
--pp;
db::Circuit::const_pin_iterator pn = p; if (pin_count >= 2) {
++pn; pids.push_back ((pin_id + pin_count - 1) % pin_count);
if (pn == cr->end_pins ()) { if (pin_count >= 3) {
pn = cr->begin_pins (); pids.push_back ((pin_id + 1) % pin_count);
if (pin_count >= 4) {
pids.push_back ((pin_id + 2) % pin_count);
}
}
} }
for (int i = 0; i < 2; ++i) { for (std::vector<size_t>::const_iterator i = pids.begin (); i != pids.end (); ++i) {
size_t pin2_id = (i == 0 ? pp->id () : pn->id ()); size_t pin2_id = *i;
EdgeDesc ed; EdgeDesc ed;
ed.subcircuit = sc; ed.subcircuit = sc;
@ -507,7 +506,7 @@ public:
edge_iterator find_edge (const std::vector<EdgeDesc> &edge) const edge_iterator find_edge (const std::vector<EdgeDesc> &edge) const
{ {
edge_iterator res = std::lower_bound (begin (), end (), edge, NetDeviceGraphNode::EdgeToEdgeOnlyCompare ()); edge_iterator res = std::lower_bound (begin (), end (), edge, NetDeviceGraphNode::EdgeToEdgeOnlyCompare ());
if (res->first != edge) { if (res == end () || res->first != edge) {
return end (); return end ();
} else { } else {
return res; return res;
@ -660,7 +659,7 @@ public:
size_t count_other = 0; size_t count_other = 0;
NetDeviceGraphNode::edge_iterator ec_other; NetDeviceGraphNode::edge_iterator ec_other;
for (NetDeviceGraphNode::edge_iterator i = e_other; i != ee_other; ++i) { for (NetDeviceGraphNode::edge_iterator i = e_other; i != ee_other; ++i) {
if (! m_nodes[i->second.first].has_other ()) { if (! other.m_nodes[i->second.first].has_other ()) {
ec_other = i; ec_other = i;
++count_other; ++count_other;
} }
@ -1783,13 +1782,13 @@ TEST(12_MismatchingSubcircuitsDuplicates)
"end;\n"; "end;\n";
const char *nls2 = const char *nls2 =
"circuit INV ($0=VDD,$1=VSS,$2=IN,$3=OUT);\n" "circuit INV ($0=VDD,$1=IN,$2=VSS,$3=OUT);\n"
" device NMOS $1 (S=OUT,G=IN,D=VSS) (L=0.25,W=0.95,AS=0.49875,AD=0.26125,PS=2.95,PD=1.5);\n" " device NMOS $1 (S=OUT,G=IN,D=VSS) (L=0.25,W=0.95,AS=0.49875,AD=0.26125,PS=2.95,PD=1.5);\n"
" device PMOS $2 (S=VDD,G=IN,D=OUT) (L=0.25,W=0.95,AS=0.49875,AD=0.26125,PS=2.95,PD=1.5);\n" " device PMOS $2 (S=VDD,G=IN,D=OUT) (L=0.25,W=0.95,AS=0.49875,AD=0.26125,PS=2.95,PD=1.5);\n"
"end;\n" "end;\n"
"circuit TOP ($0=OUT,$1=IN,$2=VDD,$3=VSS);\n" "circuit TOP ($0=OUT,$1=IN,$2=VDD,$3=VSS);\n"
" subcircuit INV $1 ($1=VDD,$2=VSS,$3=INT,$4=OUT);\n" " subcircuit INV $1 ($1=VDD,$2=INT,$3=VSS,$4=OUT);\n"
" subcircuit INV $2 ($1=VDD,$2=VSS,$3=IN,$4=INT);\n" " subcircuit INV $2 ($1=VDD,$2=IN,$3=VSS,$4=INT);\n"
"end;\n"; "end;\n";
db::Netlist nl1, nl2; db::Netlist nl1, nl2;
@ -1804,20 +1803,33 @@ TEST(12_MismatchingSubcircuitsDuplicates)
EXPECT_EQ (logger.text (), EXPECT_EQ (logger.text (),
"begin_circuit INV INV\n" "begin_circuit INV INV\n"
"match_nets VSS VSS\n" "match_nets VSS VSS\n"
"match_nets VDD VDD\n"
"match_nets OUT OUT\n" "match_nets OUT OUT\n"
"match_nets IN IN\n" "match_nets IN IN\n"
"net_mismatch VDD (null)\n"
"net_mismatch (null) VDD\n"
"match_pins $3 $2\n" "match_pins $3 $2\n"
"pin_mismatch $2 (null)\n" "match_pins $2 $0\n"
"match_pins $1 $3\n" "match_pins $1 $3\n"
"match_pins $0 $1\n" "match_pins $0 $1\n"
"pin_mismatch (null) $0\n"
"device_mismatch $1 (null)\n"
"match_devices $2 $1\n" "match_devices $2 $1\n"
"device_mismatch (null) $2\n" "match_devices $1 $2\n"
"end_circuit INV INV NOMATCH\n" "end_circuit INV INV MATCH\n"
"circuit_skipped TOP TOP" "begin_circuit TOP TOP\n"
"match_nets IN IN\n"
"match_nets VDD VDD\n"
"match_nets VSS VSS\n"
"match_nets INT INT\n"
"net_mismatch OUT (null)\n"
"net_mismatch (null) OUT\n"
"match_pins $0 $1\n"
"pin_mismatch $1 (null)\n"
"match_pins $2 $2\n"
"match_pins $3 $3\n"
"pin_mismatch (null) $0\n"
"subcircuit_mismatch $2 (null)\n"
"subcircuit_mismatch $3 (null)\n"
"subcircuit_mismatch (null) $1\n"
"match_subcircuits $1 $2\n"
"end_circuit TOP TOP NOMATCH"
); );
EXPECT_EQ (good, false); EXPECT_EQ (good, false);