Fixed test cases - main reason is the different assignment of layer numbers, mainly for the auxiliary layers such as OUTLINE

This commit is contained in:
Matthias Koefferlein 2020-08-02 00:09:20 +02:00
parent 37544e5e23
commit 440b2b122b
4 changed files with 170 additions and 61 deletions

View File

@ -972,37 +972,39 @@ LEFDEFReaderState::open_layer_uncached (db::Layout &layout, const std::string &n
std::string name = n + name_suffix;
db::LayerProperties lp (name);
lp.datatype = dt;
std::map<std::string, int>::const_iterator ldef = m_default_number.find (n);
if (ldef != m_default_number.end ()) {
lp.layer = ldef->second;
}
std::pair<bool, unsigned int> ll = m_layer_map.logical (name, layout);
if (! ll.first) {
ll = m_layer_map.logical (n, layout);
}
if (ll.first) {
const db::LayerProperties *lpp = m_layer_map.target (ll.second);
if (lpp) {
lp = *lpp;
}
} else {
ll = m_layer_map.logical (n, layout);
if (ll.first) {
const db::LayerProperties *lpp = m_layer_map.target (ll.second);
if (lpp) {
lp = *lpp;
if (lp.datatype >= 0) {
lp.datatype += dt;
}
if (lp.datatype >= 0) {
lp.datatype += dt;
}
if (lp.name.empty ()) {
lp.name = name;
}
} else if (! m_create_layers) {
return std::make_pair (false, 0);
}
} else if (! m_create_layers) {
return std::make_pair (false, 0);
}
for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) {
if ((*l).second->log_equal (lp)) {
return std::make_pair (true, (*l).first);
if (lp.layer >= 0 && lp.datatype >= 0) {
for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) {
if ((*l).second->log_equal (lp)) {
return std::make_pair (true, (*l).first);
}
}
}
@ -1023,59 +1025,106 @@ LEFDEFReaderState::finish (db::Layout &layout)
}
}
for (std::map<std::string, int>::const_iterator ln = m_default_number.begin (); ln != m_default_number.end (); ++ln) {
std::map<std::string, int> number_for_name = m_default_number;
for (std::map<std::string, int>::const_iterator ln = number_for_name.begin (); ln != number_for_name.end (); ++ln) {
used_numbers.insert (ln->second);
}
for (std::map<std::pair<std::string, std::pair<LayerPurpose, unsigned int> >, unsigned int>::const_iterator l = m_unassigned_layers.begin (); l != m_unassigned_layers.end (); ++l) {
// Assign default numbers and generate a canonical mapping
db::LayerMap lm;
for (std::map <std::pair<std::string, std::pair<LayerPurpose, unsigned int> >, std::pair<bool, unsigned int> >::const_iterator l = m_layers.begin (); l != m_layers.end (); ++l) {
if (! l->second.first) {
continue;
}
std::string ps;
int dt = 0;
switch (l->first.second.first) {
case Outline:
ps = "OUTLINE";
break;
case Regions:
ps = "REGION";
break;
case PlacementBlockage:
ps = "PLACEMENT_BLK";
break;
case Routing:
default:
dt = mp_tech_comp->routing_datatype_per_mask (l->first.second.second);
ps = "NET";
break;
case SpecialRouting:
dt = mp_tech_comp->special_routing_datatype_per_mask (l->first.second.second);
ps = "SPNET";
break;
case ViaGeometry:
dt = mp_tech_comp->via_geometry_datatype_per_mask (l->first.second.second);
ps = "VIA";
break;
case Label:
dt = mp_tech_comp->labels_datatype ();
ps = "LABEL";
break;
case Pins:
dt = mp_tech_comp->pins_datatype_per_mask (l->first.second.second);
ps = "PIN";
break;
case LEFPins:
dt = mp_tech_comp->lef_pins_datatype_per_mask (l->first.second.second);
ps = "LEFPIN";
break;
case Obstructions:
dt = mp_tech_comp->obstructions_datatype ();
ps = "OBS";
break;
case Blockage:
dt = mp_tech_comp->blockages_datatype ();
ps = "BLK";
break;
}
int dl = 0;
std::map<std::string, int>::const_iterator ln = m_default_number.find (l->first.first);
if (ln != m_default_number.end ()) {
dl = ln->second;
} else {
do {
++lnum;
} while (used_numbers.find (lnum) != used_numbers.end ());
m_default_number.insert (std::make_pair (l->first.first, lnum));
dl = lnum;
unsigned int layer_index = l->second.second;
db::LayerProperties lp = layout.get_properties (layer_index);
if (lp.layer < 0) {
std::map<std::string, int>::const_iterator n4n = number_for_name.end ();
if (! l->first.first.empty ()) {
n4n = number_for_name.find (l->first.first);
}
if (n4n == number_for_name.end ()) {
do {
++lnum;
} while (used_numbers.find (lnum) != used_numbers.end ());
number_for_name.insert (std::make_pair (l->first.first, lnum));
lp.layer = lnum;
} else {
lp.layer = n4n->second;
}
}
db::LayerProperties lp = layout.get_properties (l->second);
lp.layer = dl;
lp.datatype = dt;
layout.set_properties (l->second, lp);
if (lp.datatype < 0) {
lp.datatype = 0;
}
layout.set_properties (layer_index, lp);
std::string n = l->first.first;
if (! n.empty ()) {
n += ".";
}
n += ps;
if (l->first.second.second > 0) {
n += ":";
n += tl::to_string (l->first.second.second);
}
lm.map (db::LayerProperties (n), l->second.second, lp);
}
// On return we deliver the "canonical" map
m_layer_map = lm;
}
void

View File

@ -1047,7 +1047,6 @@ private:
LEFDEFReaderState &operator= (const LEFDEFReaderState &);
std::map <std::pair<std::string, std::pair<LayerPurpose, unsigned int> >, std::pair<bool, unsigned int> > m_layers;
std::map <std::pair<std::string, std::pair<LayerPurpose, unsigned int> >, unsigned int> m_unassigned_layers;
db::LayerMap m_layer_map;
bool m_create_layers;
bool m_has_explicit_layer_mapping;

View File

@ -49,7 +49,7 @@ static db::LEFDEFReaderOptions default_options ()
return tc;
}
static void run_test (tl::TestBase *_this, const char *lef_dir, const char *filename, const char *au, const db::LEFDEFReaderOptions &options, bool priv = true)
static db::LayerMap run_test (tl::TestBase *_this, const char *lef_dir, const char *filename, const char *au, const db::LEFDEFReaderOptions &options, bool priv = true)
{
std::string fn_path (priv ? tl::testsrc_private () : tl::testsrc ());
fn_path += "/testdata/lefdef/";
@ -186,6 +186,8 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file
}
}
return ld.layer_map ();
}
TEST(1)
@ -200,7 +202,9 @@ TEST(2)
TEST(3)
{
run_test (_this, "lef3", "lef:in.lef", "au.oas.gz", default_options ());
db::LEFDEFReaderOptions options = default_options ();
options.set_cell_outline_layer ("OUTLINE (2/0)");
run_test (_this, "lef3", "lef:in.lef", "au.oas.gz", options);
}
TEST(4)
@ -220,7 +224,9 @@ TEST(6)
TEST(7)
{
run_test (_this, "lef7", "lef:in_tech.lef+lef:in.lef", "au.oas.gz", default_options ());
db::LEFDEFReaderOptions options = default_options ();
options.set_cell_outline_layer ("OUTLINE (8/0)");
run_test (_this, "lef7", "lef:in_tech.lef+lef:in.lef", "au.oas.gz", options);
}
TEST(10)
@ -230,12 +236,16 @@ TEST(10)
TEST(11)
{
run_test (_this, "def2", "lef:0.lef+lef:1.lef+def:in.def.gz", "au.oas.gz", default_options ());
db::LEFDEFReaderOptions options = default_options ();
options.set_cell_outline_layer ("OUTLINE (10/0)");
run_test (_this, "def2", "lef:0.lef+lef:1.lef+def:in.def.gz", "au.oas.gz", options);
}
TEST(12)
{
run_test (_this, "def3", "lef:in.lef+def:in.def", "au.oas.gz", default_options ());
db::LEFDEFReaderOptions options = default_options ();
options.set_cell_outline_layer ("OUTLINE (13/0)");
run_test (_this, "def3", "lef:in.lef+def:in.def", "au.oas.gz", options);
}
TEST(13)
@ -255,8 +265,12 @@ TEST(15)
TEST(16)
{
run_test (_this, "def7", "lef:cells.lef+lef:tech.lef+def:in.def.gz", "au.oas.gz", default_options ());
run_test (_this, "def7", "map:in.map+lef:cells.lef+lef:tech.lef+def:in.def.gz", "au_with_map_file.oas.gz", default_options ());
db::LEFDEFReaderOptions options = default_options ();
options.set_placement_blockage_layer ("PLACEMENT_BLK (11/0)");
run_test (_this, "def7", "lef:cells.lef+lef:tech.lef+def:in.def.gz", "au.oas.gz", options);
options.set_placement_blockage_layer ("PLACEMENT_BLK (60/0)");
run_test (_this, "def7", "map:in.map+lef:cells.lef+lef:tech.lef+def:in.def.gz", "au_with_map_file.oas.gz", options);
}
TEST(17)
@ -275,17 +289,23 @@ TEST(18)
TEST(19)
{
run_test (_this, "def10", "def:in.def", "au.oas.gz", default_options ());
db::LEFDEFReaderOptions opt = default_options ();
opt.set_cell_outline_layer ("OUTLINE (2/0)");
run_test (_this, "def10", "def:in.def", "au.oas.gz", opt);
}
TEST(20)
{
run_test (_this, "def11", "lef:test.lef+def:test.def", "au.oas.gz", default_options ());
db::LEFDEFReaderOptions opt = default_options ();
opt.set_cell_outline_layer ("OUTLINE (12/0)");
run_test (_this, "def11", "lef:test.lef+def:test.def", "au.oas.gz", opt);
}
TEST(21)
{
run_test (_this, "def12", "lef:test.lef+def:test.def", "au.oas.gz", default_options ());
db::LEFDEFReaderOptions opt = default_options ();
opt.set_cell_outline_layer ("OUTLINE (20/0)");
run_test (_this, "def12", "lef:test.lef+def:test.def", "au.oas.gz", opt);
}
TEST(100)
@ -298,6 +318,7 @@ TEST(101)
db::LEFDEFReaderOptions opt = default_options ();
opt.set_produce_pin_names (true);
opt.set_pin_property_name (2);
opt.set_cell_outline_layer ("OUTLINE (13/0)");
run_test (_this, "issue-489", "lef:in.lef+def:in.def", "au.oas", opt, false);
}
@ -306,17 +327,22 @@ TEST(102)
db::LEFDEFReaderOptions opt = default_options ();
opt.set_produce_pin_names (true);
opt.set_pin_property_name (3);
opt.set_cell_outline_layer ("OUTLINE (8/0)");
run_test (_this, "issue-489b", "lef:in_tech.lef+lef:in.lef", "au.oas.gz", opt, false);
}
TEST(103)
{
run_test (_this, "issue-517", "def:in.def", "au.oas.gz", default_options (), false);
db::LEFDEFReaderOptions options = default_options ();
options.set_cell_outline_layer ("OUTLINE (4/0)");
run_test (_this, "issue-517", "def:in.def", "au.oas.gz", options, false);
}
TEST(104_doxy_vias)
{
run_test (_this, "doxy_vias", "def:test.def", "au.oas.gz", default_options (), false);
db::LEFDEFReaderOptions options = default_options ();
options.set_cell_outline_layer ("OUTLINE (4/0)");
run_test (_this, "doxy_vias", "def:test.def", "au.oas.gz", options, false);
}
TEST(105_specialnets_geo)
@ -354,9 +380,10 @@ TEST(108_scanchain)
TEST(109_foreigncell)
{
run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef+def:in.def", "au.oas.gz", default_options (), false);
db::LEFDEFReaderOptions options = default_options ();
options.set_cell_outline_layer ("OUTLINE (43/0)");
run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef+def:in.def", "au.oas.gz", options, false);
run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in2.lef+def:in.def", "au_default.oas.gz", options, false);
@ -373,6 +400,7 @@ TEST(110_lefpins)
{
db::LEFDEFReaderOptions options = default_options ();
options.set_produce_lef_pins (false);
options.set_cell_outline_layer ("OUTLINE (8/0)");
run_test (_this, "lefpins", "lef:in_tech.lef+lef:in.lef+def:in.def", "au_no_lefpins.oas.gz", options, false);
options.set_produce_lef_pins (true);
@ -392,7 +420,14 @@ TEST(111_mapfile)
TEST(112_via_properties)
{
run_test (_this, "via_properties", "lef:in.lef+def:in.def", "au.oas.gz", default_options (), false);
db::LEFDEFReaderOptions options = default_options ();
db::LayerMap lm = db::LayerMap::from_string_file_format ("metal1: 1\nvia1: 2\nmetal2: 3");
options.set_layer_map (lm);
db::LayerMap lm_read = run_test (_this, "via_properties", "lef:in.lef+def:in.def", "au.oas.gz", options, false);
EXPECT_EQ (lm_read.to_string (),
"layer_map('OUTLINE : OUTLINE (4/0)';'metal1.VIA : metal1 (1/0)';'metal2.VIA : metal2 (3/0)';'via1.VIA : via1 (2/0)')"
)
}
TEST(113_masks_1)
@ -410,7 +445,33 @@ TEST(113_masks_1)
options.set_pins_suffix ("");
options.set_pins_datatype_per_mask (1, 110);
options.set_pins_datatype_per_mask (2, 210);
options.set_cell_outline_layer ("OUTLINE (4/0)");
run_test (_this, "masks-1", "lef:in_tech.lef+def:in.def", "au.oas.gz", options, false);
db::LayerMap lm = db::LayerMap::from_string_file_format ("M1: 3\nM0PO: 1\nVIA0: 2");
options.set_layer_map (lm);
db::LayerMap lm_read = run_test (_this, "masks-1", "lef:in_tech.lef+def:in.def", "au.oas.gz", options, false);
EXPECT_EQ (lm_read.to_string_file_format (),
"OUTLINE : OUTLINE (4/0)\n"
"'M0PO.SPNET:1' : M0PO (1/101)\n"
"'M1.SPNET:2' : M1 (3/201)\n"
"'M1.SPNET:1' : M1 (3/101)\n"
"'M0PO.VIA:2' : M0PO (1/202)\n"
"'M1.VIA:1' : M1 (3/102)\n"
"'VIA0.VIA:1' : VIA0 (2/102)\n"
"'M0PO.SPNET:2' : M0PO (1/201)\n"
"M0PO.PIN : M0PO (1/2)\n"
"M0PO.LABEL : M0PO.LABEL (1/1)\n"
"'M0PO.PIN:2' : M0PO (1/210)\n"
"'M1.PIN:1' : M1 (3/110)\n"
"M1.LABEL : M1.LABEL (3/1)\n"
"'M1.NET:1' : M1 (3/100)\n"
"'M1.NET:2' : M1 (3/200)\n"
"'M0PO.VIA:1' : M0PO (1/102)\n"
"'M1.VIA:2' : M1 (3/202)\n"
"'VIA0.VIA:2' : VIA0 (2/202)\n"
"'M0PO.NET:1' : M0PO (1/100)\n"
)
}

Binary file not shown.