mirror of
https://github.com/KLayout/klayout.git
synced 2026-08-30 17:53:00 +02:00
Merge remote-tracking branch 'remotes/origin/master' into pymod
Provides fixes for issue #166 and #172.
This commit is contained in:
@@ -1145,3 +1145,11 @@ TEST(121)
|
||||
opt.max_vertex_count = 4;
|
||||
run_test (_this, "t121.oas.gz", "t121_au.gds.gz", true, opt);
|
||||
}
|
||||
|
||||
// Extreme fracturing by max. points
|
||||
TEST(166)
|
||||
{
|
||||
db::GDS2WriterOptions opt;
|
||||
opt.max_vertex_count = 4;
|
||||
run_test (_this, "t166.oas.gz", "t166_au.gds.gz", false, opt);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -533,6 +533,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
|
||||
*/
|
||||
|
||||
@@ -458,6 +458,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 (";");
|
||||
@@ -543,9 +546,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);
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
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)
|
||||
{
|
||||
db::LEFDEFReaderOptions tc;
|
||||
tc.set_via_geometry_datatype (0);
|
||||
@@ -60,7 +60,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 += "/";
|
||||
@@ -73,7 +73,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 += "/";
|
||||
@@ -118,7 +118,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 += "/";
|
||||
@@ -233,3 +233,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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user