Fixed #172 (DEF reader does not pull vias from LEF)

This commit is contained in:
Matthias Koefferlein 2018-09-26 20:49:04 +02:00
parent 2236a7662d
commit d4adb194e3
10 changed files with 156 additions and 18 deletions

View File

@ -70,17 +70,6 @@ DEFImporter::get_orient (bool optional)
}
}
/**
* @brief A structure describing a via
*/
struct ViaDesc
{
ViaDesc () : cell (0) { }
db::Cell *cell;
std::string m1, m2;
};
void
DEFImporter::read_polygon (db::Polygon &poly, double scale)
{
@ -153,7 +142,7 @@ DEFImporter::do_read (db::Layout &layout)
double dbu_mic = 1000.0;
double scale = 1.0 / (dbu_mic * layout.dbu ());
std::map<int, db::Polygon> styles;
std::map<std::string, ViaDesc> via_desc;
std::map<std::string, ViaDesc> via_desc = m_lef_importer.vias ();
std::map<std::string, std::vector<db::Polygon> > regions;
std::list<Group> groups;
std::list<std::pair<std::string, db::CellInstArray> > instances;

View File

@ -534,6 +534,24 @@ private:
const LEFDEFReaderOptions *mp_tech_comp;
};
/**
* @brief A structure describing a via
*/
struct EXT_PUBLIC ViaDesc
{
ViaDesc () : cell (0) { }
/**
* @brief The cell representing the via
*/
db::Cell *cell;
/**
* @brief The names of bottom and top metal respectively
*/
std::string m1, m2;
};
/**
* @brief The LEF importer object
*/

View File

@ -459,6 +459,9 @@ LEFImporter::do_read (db::Layout &layout)
std::string cellname = "VIA_" + n;
db::Cell &cell = layout.cell (layout.add_cell (cellname.c_str ()));
ViaDesc &via_desc = m_vias[n];
via_desc.cell = &cell;
while (test ("DEFAULT") || test ("TOPOFSTACKONLY"))
;
test (";");
@ -544,9 +547,9 @@ LEFImporter::do_read (db::Layout &layout)
} else if (test ("LAYERS")) {
geometry[0].first = get ();
via_desc.m1 = geometry[0].first = get ();
geometry[1].first = get ();
geometry[2].first = get ();
via_desc.m2 = geometry[2].first = get ();
test (";");

View File

@ -86,6 +86,16 @@ public:
*/
double layer_ext (const std::string &layer, double def_ext = 0.0) const;
/**
* @brief Gets a map of the vias defined in this LEF file
*
* The map maps the via name to the via description.
*/
const std::map<std::string, ViaDesc> &vias () const
{
return m_vias;
}
protected:
void do_read (db::Layout &layout);
@ -95,6 +105,7 @@ private:
std::map<std::string, double> m_default_ext;
std::map<std::string, db::Cell *> m_macros_by_name;
std::map<std::string, db::Box> m_macro_bboxes_by_name;
std::map<std::string, ViaDesc> m_vias;
std::vector <db::Trans> get_iteration (db::Layout &layout);
void read_geometries (db::Layout &layout, db::Cell &cell, LayerPurpose purpose, std::map<std::string, db::Box> *collect_bboxes = 0);

View File

@ -33,7 +33,7 @@
#include <cstdlib>
#include <QDir>
static void run_test (tl::TestBase *_this, const char *lef_dir, const char *filename, const char *au)
static void run_test (tl::TestBase *_this, const char *lef_dir, const char *filename, const char *au, bool priv = true)
{
ext::LEFDEFReaderOptions tc;
tc.set_via_geometry_datatype (0);
@ -63,7 +63,7 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file
if (ex.test ("def:")) {
std::string fn (tl::testsrc_private ());
std::string fn (priv ? tl::testsrc_private () : tl::testsrc ());
fn += "/testdata/lefdef/";
fn += lef_dir;
fn += "/";
@ -76,7 +76,7 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file
} else if (ex.test ("lef:")) {
std::string fn (tl::testsrc_private ());
std::string fn (priv ? tl::testsrc_private () : tl::testsrc ());
fn += "/testdata/lefdef/";
fn += lef_dir;
fn += "/";
@ -120,7 +120,7 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file
if (au) {
std::string fn (tl::testsrc_private ());
std::string fn (priv ? tl::testsrc_private () : tl::testsrc ());
fn += "/testdata/lefdef/";
fn += lef_dir;
fn += "/";
@ -235,3 +235,8 @@ TEST(19)
run_test (_this, "def10", "def:in.def", "au.oas.gz");
}
TEST(20)
{
run_test (_this, "issue-172", "lef:in.lef+def:in.def", "au.oas.gz", false);
}

16
testdata/lefdef/issue-172.def vendored Normal file
View File

@ -0,0 +1,16 @@
VERSION 5.6 ;
NAMESCASESENSITIVE ON ;
DIVIDERCHAR "/" ;
BUSBITCHARS "<>" ;
DESIGN SMALL ;
UNITS DISTANCE MICRONS 100 ;
DIEAREA ( -30 -30 ) ( 1030 1030 ) ;
NETS 1 ;
- TOP
+ ROUTED M1 ( 0 0 ) ( 1000 * ) M2_M1
NEW M2 ( 1000 0 ) ( 1000 1000 ) ;
END NETS
END DESIGN

40
testdata/lefdef/issue-172.lef vendored Normal file
View File

@ -0,0 +1,40 @@
VERSION 5.7 ;
NAMESCASESENSITIVE ON ;
BUSBITCHARS "[]" ;
DIVIDERCHAR "/" ;
UNITS
DATABASE MICRONS 1000 ;
END UNITS
USEMINSPACING OBS ON ;
USEMINSPACING PIN OFF ;
CLEARANCEMEASURE EUCLIDEAN ;
MANUFACTURINGGRID 0.05 ;
LAYER M1
TYPE ROUTING ;
DIRECTION HORIZONTAL ;
WIDTH 0.2 ;
END M1
LAYER V2
TYPE CUT ;
END V2
LAYER M2
TYPE ROUTING ;
DIRECTION VERTICAL ;
WIDTH 0.2 ;
END M2
VIA M2_M1 DEFAULT
LAYER M1 ;
RECT -0.300 -0.300 0.300 0.300 ;
LAYER V2 ;
RECT -0.200 -0.200 0.200 0.200 ;
LAYER M2 ;
RECT -0.300 -0.300 0.300 0.300 ;
END M2_M1
END LIBRARY

BIN
testdata/lefdef/issue-172/au.oas.gz vendored Normal file

Binary file not shown.

16
testdata/lefdef/issue-172/in.def vendored Normal file
View File

@ -0,0 +1,16 @@
VERSION 5.6 ;
NAMESCASESENSITIVE ON ;
DIVIDERCHAR "/" ;
BUSBITCHARS "<>" ;
DESIGN SMALL ;
UNITS DISTANCE MICRONS 100 ;
DIEAREA ( -30 -30 ) ( 1030 1030 ) ;
NETS 1 ;
- TOP
+ ROUTED M1 ( 0 0 ) ( 1000 * ) M2_M1
NEW M2 ( 1000 0 ) ( 1000 1000 ) ;
END NETS
END DESIGN

40
testdata/lefdef/issue-172/in.lef vendored Normal file
View File

@ -0,0 +1,40 @@
VERSION 5.7 ;
NAMESCASESENSITIVE ON ;
BUSBITCHARS "[]" ;
DIVIDERCHAR "/" ;
UNITS
DATABASE MICRONS 1000 ;
END UNITS
USEMINSPACING OBS ON ;
USEMINSPACING PIN OFF ;
CLEARANCEMEASURE EUCLIDEAN ;
MANUFACTURINGGRID 0.05 ;
LAYER M1
TYPE ROUTING ;
DIRECTION HORIZONTAL ;
WIDTH 0.2 ;
END M1
LAYER V2
TYPE CUT ;
END V2
LAYER M2
TYPE ROUTING ;
DIRECTION VERTICAL ;
WIDTH 0.2 ;
END M2
VIA M2_M1 DEFAULT
LAYER M1 ;
RECT -0.300 -0.300 0.300 0.300 ;
LAYER V2 ;
RECT -0.200 -0.200 0.200 0.200 ;
LAYER M2 ;
RECT -0.300 -0.300 0.300 0.300 ;
END M2_M1
END LIBRARY