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
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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 (";");
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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