mirror of https://github.com/KLayout/klayout.git
Fixed #172 (DEF reader does not pull vias from LEF)
This commit is contained in:
parent
2236a7662d
commit
d4adb194e3
|
|
@ -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
|
void
|
||||||
DEFImporter::read_polygon (db::Polygon &poly, double scale)
|
DEFImporter::read_polygon (db::Polygon &poly, double scale)
|
||||||
{
|
{
|
||||||
|
|
@ -153,7 +142,7 @@ DEFImporter::do_read (db::Layout &layout)
|
||||||
double dbu_mic = 1000.0;
|
double dbu_mic = 1000.0;
|
||||||
double scale = 1.0 / (dbu_mic * layout.dbu ());
|
double scale = 1.0 / (dbu_mic * layout.dbu ());
|
||||||
std::map<int, db::Polygon> styles;
|
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::map<std::string, std::vector<db::Polygon> > regions;
|
||||||
std::list<Group> groups;
|
std::list<Group> groups;
|
||||||
std::list<std::pair<std::string, db::CellInstArray> > instances;
|
std::list<std::pair<std::string, db::CellInstArray> > instances;
|
||||||
|
|
|
||||||
|
|
@ -534,6 +534,24 @@ private:
|
||||||
const LEFDEFReaderOptions *mp_tech_comp;
|
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
|
* @brief The LEF importer object
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -459,6 +459,9 @@ LEFImporter::do_read (db::Layout &layout)
|
||||||
std::string cellname = "VIA_" + n;
|
std::string cellname = "VIA_" + n;
|
||||||
db::Cell &cell = layout.cell (layout.add_cell (cellname.c_str ()));
|
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"))
|
while (test ("DEFAULT") || test ("TOPOFSTACKONLY"))
|
||||||
;
|
;
|
||||||
test (";");
|
test (";");
|
||||||
|
|
@ -544,9 +547,9 @@ LEFImporter::do_read (db::Layout &layout)
|
||||||
|
|
||||||
} else if (test ("LAYERS")) {
|
} else if (test ("LAYERS")) {
|
||||||
|
|
||||||
geometry[0].first = get ();
|
via_desc.m1 = geometry[0].first = get ();
|
||||||
geometry[1].first = get ();
|
geometry[1].first = get ();
|
||||||
geometry[2].first = get ();
|
via_desc.m2 = geometry[2].first = get ();
|
||||||
|
|
||||||
test (";");
|
test (";");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,16 @@ public:
|
||||||
*/
|
*/
|
||||||
double layer_ext (const std::string &layer, double def_ext = 0.0) const;
|
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:
|
protected:
|
||||||
void do_read (db::Layout &layout);
|
void do_read (db::Layout &layout);
|
||||||
|
|
||||||
|
|
@ -95,6 +105,7 @@ private:
|
||||||
std::map<std::string, double> m_default_ext;
|
std::map<std::string, double> m_default_ext;
|
||||||
std::map<std::string, db::Cell *> m_macros_by_name;
|
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, db::Box> m_macro_bboxes_by_name;
|
||||||
|
std::map<std::string, ViaDesc> m_vias;
|
||||||
|
|
||||||
std::vector <db::Trans> get_iteration (db::Layout &layout);
|
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);
|
void read_geometries (db::Layout &layout, db::Cell &cell, LayerPurpose purpose, std::map<std::string, db::Box> *collect_bboxes = 0);
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <QDir>
|
#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;
|
ext::LEFDEFReaderOptions tc;
|
||||||
tc.set_via_geometry_datatype (0);
|
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:")) {
|
if (ex.test ("def:")) {
|
||||||
|
|
||||||
std::string fn (tl::testsrc_private ());
|
std::string fn (priv ? tl::testsrc_private () : tl::testsrc ());
|
||||||
fn += "/testdata/lefdef/";
|
fn += "/testdata/lefdef/";
|
||||||
fn += lef_dir;
|
fn += lef_dir;
|
||||||
fn += "/";
|
fn += "/";
|
||||||
|
|
@ -76,7 +76,7 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file
|
||||||
|
|
||||||
} else if (ex.test ("lef:")) {
|
} else if (ex.test ("lef:")) {
|
||||||
|
|
||||||
std::string fn (tl::testsrc_private ());
|
std::string fn (priv ? tl::testsrc_private () : tl::testsrc ());
|
||||||
fn += "/testdata/lefdef/";
|
fn += "/testdata/lefdef/";
|
||||||
fn += lef_dir;
|
fn += lef_dir;
|
||||||
fn += "/";
|
fn += "/";
|
||||||
|
|
@ -120,7 +120,7 @@ static void run_test (tl::TestBase *_this, const char *lef_dir, const char *file
|
||||||
|
|
||||||
if (au) {
|
if (au) {
|
||||||
|
|
||||||
std::string fn (tl::testsrc_private ());
|
std::string fn (priv ? tl::testsrc_private () : tl::testsrc ());
|
||||||
fn += "/testdata/lefdef/";
|
fn += "/testdata/lefdef/";
|
||||||
fn += lef_dir;
|
fn += lef_dir;
|
||||||
fn += "/";
|
fn += "/";
|
||||||
|
|
@ -235,3 +235,8 @@ TEST(19)
|
||||||
run_test (_this, "def10", "def:in.def", "au.oas.gz");
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
Binary file not shown.
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue