mirror of https://github.com/KLayout/klayout.git
Debugging & testing
This commit is contained in:
parent
3361802a20
commit
56fbba60c1
|
|
@ -40,7 +40,7 @@ namespace db
|
|||
// OASISReader
|
||||
|
||||
OASISReader::OASISReader (tl::InputStream &s)
|
||||
: m_stream (s),
|
||||
: m_stream (s),
|
||||
m_progress (tl::to_string (tr ("Reading OASIS file")), 10000),
|
||||
m_dbu (0.001),
|
||||
m_expect_strict_mode (-1),
|
||||
|
|
@ -111,7 +111,7 @@ OASISReader::init (const db::LoadLayoutOptions &options)
|
|||
m_expect_strict_mode = oasis_options.expect_strict_mode;
|
||||
}
|
||||
|
||||
inline long long
|
||||
inline long long
|
||||
OASISReader::get_long_long ()
|
||||
{
|
||||
unsigned long long u = get_ulong_long ();
|
||||
|
|
@ -122,13 +122,13 @@ OASISReader::get_long_long ()
|
|||
}
|
||||
}
|
||||
|
||||
inline unsigned long long
|
||||
inline unsigned long long
|
||||
OASISReader::get_ulong_long ()
|
||||
{
|
||||
unsigned long long v = 0;
|
||||
unsigned long long vm = 1;
|
||||
char c;
|
||||
|
||||
|
||||
do {
|
||||
unsigned char *b = (unsigned char *) m_stream.get (1);
|
||||
if (! b) {
|
||||
|
|
@ -136,7 +136,7 @@ OASISReader::get_ulong_long ()
|
|||
return 0;
|
||||
}
|
||||
c = *b;
|
||||
if (vm > std::numeric_limits <unsigned long long>::max () / 128 &&
|
||||
if (vm > std::numeric_limits <unsigned long long>::max () / 128 &&
|
||||
(unsigned long long) (c & 0x7f) > (std::numeric_limits <unsigned long long>::max () / vm)) {
|
||||
error (tl::to_string (tr ("Unsigned long value overflow")));
|
||||
}
|
||||
|
|
@ -147,7 +147,7 @@ OASISReader::get_ulong_long ()
|
|||
return v;
|
||||
}
|
||||
|
||||
inline long
|
||||
inline long
|
||||
OASISReader::get_long ()
|
||||
{
|
||||
unsigned long u = get_ulong ();
|
||||
|
|
@ -168,13 +168,13 @@ OASISReader::get_ulong_for_divider ()
|
|||
return l;
|
||||
}
|
||||
|
||||
inline unsigned long
|
||||
inline unsigned long
|
||||
OASISReader::get_ulong ()
|
||||
{
|
||||
unsigned long v = 0;
|
||||
unsigned long vm = 1;
|
||||
char c;
|
||||
|
||||
|
||||
do {
|
||||
unsigned char *b = (unsigned char *) m_stream.get (1);
|
||||
if (! b) {
|
||||
|
|
@ -182,7 +182,7 @@ OASISReader::get_ulong ()
|
|||
return 0;
|
||||
}
|
||||
c = *b;
|
||||
if (vm > std::numeric_limits <unsigned long>::max () / 128 &&
|
||||
if (vm > std::numeric_limits <unsigned long>::max () / 128 &&
|
||||
(unsigned long) (c & 0x7f) > (std::numeric_limits <unsigned long>::max () / vm)) {
|
||||
error (tl::to_string (tr ("Unsigned long value overflow")));
|
||||
}
|
||||
|
|
@ -193,7 +193,7 @@ OASISReader::get_ulong ()
|
|||
return v;
|
||||
}
|
||||
|
||||
inline int
|
||||
inline int
|
||||
OASISReader::get_int ()
|
||||
{
|
||||
unsigned int u = get_uint ();
|
||||
|
|
@ -204,13 +204,13 @@ OASISReader::get_int ()
|
|||
}
|
||||
}
|
||||
|
||||
inline unsigned int
|
||||
inline unsigned int
|
||||
OASISReader::get_uint ()
|
||||
{
|
||||
unsigned int v = 0;
|
||||
unsigned int vm = 1;
|
||||
char c;
|
||||
|
||||
|
||||
do {
|
||||
unsigned char *b = (unsigned char *) m_stream.get (1);
|
||||
if (! b) {
|
||||
|
|
@ -218,7 +218,7 @@ OASISReader::get_uint ()
|
|||
return 0;
|
||||
}
|
||||
c = *b;
|
||||
if (vm > std::numeric_limits <unsigned int>::max () / 128 &&
|
||||
if (vm > std::numeric_limits <unsigned int>::max () / 128 &&
|
||||
(unsigned int) (c & 0x7f) > (std::numeric_limits <unsigned int>::max () / vm)) {
|
||||
error (tl::to_string (tr ("Unsigned integer value overflow")));
|
||||
}
|
||||
|
|
@ -229,7 +229,7 @@ OASISReader::get_uint ()
|
|||
return v;
|
||||
}
|
||||
|
||||
std::string
|
||||
std::string
|
||||
OASISReader::get_str ()
|
||||
{
|
||||
std::string s;
|
||||
|
|
@ -258,11 +258,11 @@ OASISReader::get_real ()
|
|||
|
||||
if (t == 0) {
|
||||
|
||||
return double (get_ulong ());
|
||||
return double (get_ulong ());
|
||||
|
||||
} else if (t == 1) {
|
||||
|
||||
return -double (get_ulong ());
|
||||
return -double (get_ulong ());
|
||||
|
||||
} else if (t == 2) {
|
||||
|
||||
|
|
@ -445,7 +445,7 @@ OASISReader::get_gdelta (long grid)
|
|||
ly > (long long) (std::numeric_limits <db::Coord>::max ())) {
|
||||
error (tl::to_string (tr ("Coordinate value overflow")));
|
||||
}
|
||||
|
||||
|
||||
return db::Vector (db::Coord (lx), db::Coord (ly));
|
||||
|
||||
} else {
|
||||
|
|
@ -480,13 +480,13 @@ OASISReader::get_gdelta (long grid)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::error (const std::string &msg)
|
||||
{
|
||||
throw OASISReaderException (msg, m_stream.pos (), m_cellname.c_str ());
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::warn (const std::string &msg, int wl)
|
||||
{
|
||||
if (warn_level () < wl) {
|
||||
|
|
@ -497,7 +497,7 @@ OASISReader::warn (const std::string &msg, int wl)
|
|||
error (msg);
|
||||
} else {
|
||||
// TODO: compress
|
||||
tl::warn << msg
|
||||
tl::warn << msg
|
||||
<< tl::to_string (tr (" (position=")) << m_stream.pos ()
|
||||
<< tl::to_string (tr (", cell=")) << m_cellname
|
||||
<< ")";
|
||||
|
|
@ -516,7 +516,7 @@ struct LNameJoinOp1
|
|||
};
|
||||
|
||||
/**
|
||||
* @brief A helper class to join two layer map members
|
||||
* @brief A helper class to join two layer map members
|
||||
* This implementation basically merged the datatype maps.
|
||||
*/
|
||||
struct LNameJoinOp2
|
||||
|
|
@ -533,16 +533,16 @@ struct LNameJoinOp2
|
|||
*
|
||||
* This method will update m_table_start which is the location used as
|
||||
* the start position of a strict mode table. Every record except CBLOCK
|
||||
* will update this position to point after the record. Hence m_table_start
|
||||
* points to the beginning of a table when PROPNAME, CELLNAME or any
|
||||
* will update this position to point after the record. Hence m_table_start
|
||||
* points to the beginning of a table when PROPNAME, CELLNAME or any
|
||||
* other table-contained record is encountered.
|
||||
* Since CBLOCK does not update this record, the position of the table will
|
||||
* be the location of CBLOCK rather than that of the name record itself.
|
||||
* PAD records will also call this method, so the beginning of a table
|
||||
* PAD records will also call this method, so the beginning of a table
|
||||
* is right after any preceding PAD records and exactly at the location
|
||||
* of the first name record after PADs.
|
||||
*/
|
||||
void
|
||||
void
|
||||
OASISReader::mark_start_table ()
|
||||
{
|
||||
// we need to this this to really finish a CBLOCK - this is a flaw
|
||||
|
|
@ -554,7 +554,7 @@ OASISReader::mark_start_table ()
|
|||
m_table_start = m_stream.pos ();
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::read_offset_table ()
|
||||
{
|
||||
unsigned int of = 0;
|
||||
|
|
@ -601,7 +601,7 @@ static const char *klayout_context_propname = "KLAYOUT_CONTEXT";
|
|||
static const char *s_gds_property_propname = "S_GDS_PROPERTY";
|
||||
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read (db::Layout &layout)
|
||||
{
|
||||
unsigned char r;
|
||||
|
|
@ -844,8 +844,40 @@ OASISReader::do_read (db::Layout &layout)
|
|||
|
||||
db::PropertiesRepository &rep = layout.properties_repository ();
|
||||
|
||||
// exchange the properties in the repository: first locate all
|
||||
// property sets that are affected
|
||||
// exchange properties in layout_properties
|
||||
db::PropertiesRepository::properties_set new_set;
|
||||
|
||||
for (db::PropertiesRepository::properties_set::const_iterator s = layout_properties.begin (); s != layout_properties.end (); ++s) {
|
||||
if (s->first == pf->second && is_s_gds_property) {
|
||||
|
||||
// S_GDS_PROPERTY translation
|
||||
if (!s->second.is_list () || s->second.get_list ().size () != 2) {
|
||||
error (tl::to_string (tr ("S_GDS_PROPERTY must have a value list with exactly two elements")));
|
||||
}
|
||||
|
||||
new_set.insert (std::make_pair (rep.prop_name_id (s->second.get_list () [0]), s->second.get_list () [1]));
|
||||
|
||||
} else if (s->first == pf->second && is_klayout_context_property) {
|
||||
|
||||
// feed context strings from klayout context property
|
||||
if (s->second.is_list ()) {
|
||||
for (auto l = s->second.begin (); l != s->second.end (); ++l) {
|
||||
context_properties.push_back (*l);
|
||||
}
|
||||
} else {
|
||||
context_properties.push_back (s->second);
|
||||
}
|
||||
|
||||
} else {
|
||||
new_set.insert (*s);
|
||||
}
|
||||
}
|
||||
|
||||
new_set.swap (layout_properties);
|
||||
|
||||
// exchange the properties in the repository
|
||||
|
||||
// first locate all property sets that are affected
|
||||
std::vector <db::properties_id_type> pids;
|
||||
for (db::PropertiesRepository::iterator p = rep.begin (); p != rep.end (); ++p) {
|
||||
if (p->second.find (pf->second) != p->second.end ()) {
|
||||
|
|
@ -871,13 +903,18 @@ OASISReader::do_read (db::Layout &layout)
|
|||
|
||||
} else if (s->first == pf->second && is_klayout_context_property) {
|
||||
|
||||
// feed context strings from klayout context property
|
||||
if (s->second.is_list ()) {
|
||||
for (auto l = s->second.begin (); l != s->second.end (); ++l) {
|
||||
context_properties.push_back (*l);
|
||||
if (*pid == layout.prop_id ()) {
|
||||
// feed context strings from klayout context property
|
||||
if (s->second.is_list ()) {
|
||||
for (auto l = s->second.begin (); l != s->second.end (); ++l) {
|
||||
context_properties.push_back (*l);
|
||||
}
|
||||
} else {
|
||||
context_properties.push_back (s->second);
|
||||
}
|
||||
} else {
|
||||
context_properties.push_back (s->second);
|
||||
// TODO: should update that in cells (in case we encounter forward-referenced context properties
|
||||
// for cells)
|
||||
}
|
||||
|
||||
} else {
|
||||
|
|
@ -964,7 +1001,7 @@ OASISReader::do_read (db::Layout &layout)
|
|||
layout_properties.clear ();
|
||||
}
|
||||
|
||||
// read a layer name
|
||||
// read a layer name
|
||||
std::string name = get_str ();
|
||||
|
||||
db::ld_type dt1 = 0, dt2 = std::numeric_limits<db::ld_type>::max () - 1;
|
||||
|
|
@ -1297,7 +1334,7 @@ OASISReader::store_last_properties (db::PropertiesRepository &rep, db::Propertie
|
|||
// Special properties are not turned into user properties except S_GDS_PROPERTY.
|
||||
// This is mode is used for cells and layouts so the standard properties do not appear as user properties.
|
||||
// For shapes we need to keep the special ones since they may be forward-references S_GDS_PROPERTY names.
|
||||
|
||||
|
||||
} else if (mm_last_value_list.get ().size () == 0) {
|
||||
properties.insert (std::make_pair (mm_last_property_name.get (), tl::Variant ()));
|
||||
} else if (mm_last_value_list.get ().size () == 1) {
|
||||
|
|
@ -1307,7 +1344,7 @@ OASISReader::store_last_properties (db::PropertiesRepository &rep, db::Propertie
|
|||
}
|
||||
}
|
||||
|
||||
std::pair <bool, db::properties_id_type>
|
||||
std::pair <bool, db::properties_id_type>
|
||||
OASISReader::read_element_properties (db::PropertiesRepository &rep, bool ignore_special)
|
||||
{
|
||||
db::PropertiesRepository::properties_set properties;
|
||||
|
|
@ -1322,7 +1359,7 @@ OASISReader::read_element_properties (db::PropertiesRepository &rep, bool ignore
|
|||
|
||||
// skip PAD.
|
||||
mark_start_table ();
|
||||
|
||||
|
||||
} else if (m == 34 /*CBLOCK*/) {
|
||||
|
||||
unsigned int type = get_uint ();
|
||||
|
|
@ -1357,7 +1394,7 @@ OASISReader::read_element_properties (db::PropertiesRepository &rep, bool ignore
|
|||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (! properties.empty ()) {
|
||||
return std::make_pair (true, rep.properties_id (properties));
|
||||
|
|
@ -1366,7 +1403,7 @@ OASISReader::read_element_properties (db::PropertiesRepository &rep, bool ignore
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::read_properties (db::PropertiesRepository &rep)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -1475,12 +1512,12 @@ OASISReader::read_properties (db::PropertiesRepository &rep)
|
|||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
|
||||
void
|
||||
OASISReader::read_pointlist (modal_variable <std::vector <db::Point> > &pointlist, bool for_polygon)
|
||||
{
|
||||
unsigned int type = get_uint ();
|
||||
|
||||
|
||||
unsigned long n = 0;
|
||||
get (n);
|
||||
if (n == 0) {
|
||||
|
|
@ -1571,13 +1608,13 @@ OASISReader::read_repetition ()
|
|||
{
|
||||
unsigned int type = get_uint ();
|
||||
if (type == 0) {
|
||||
|
||||
|
||||
// reuse modal variable
|
||||
|
||||
} else if (type == 1) {
|
||||
|
||||
unsigned long nx = 0, ny = 0;
|
||||
get (nx);
|
||||
get (nx);
|
||||
get (ny);
|
||||
|
||||
db::Coord dx = get_ucoord ();
|
||||
|
|
@ -1588,7 +1625,7 @@ OASISReader::read_repetition ()
|
|||
} else if (type == 2) {
|
||||
|
||||
unsigned long nx = 0;
|
||||
get (nx);
|
||||
get (nx);
|
||||
|
||||
db::Coord dx = get_ucoord ();
|
||||
|
||||
|
|
@ -1604,7 +1641,7 @@ OASISReader::read_repetition ()
|
|||
mm_repetition = new RegularRepetition (db::Vector (0, 0), db::Vector (0, dy), 1, dy == 0 ? 1 : ny + 2);
|
||||
|
||||
} else if (type == 4 || type == 5) {
|
||||
|
||||
|
||||
IrregularRepetition *rep = new IrregularRepetition ();
|
||||
mm_repetition = rep;
|
||||
|
||||
|
|
@ -1629,7 +1666,7 @@ OASISReader::read_repetition ()
|
|||
}
|
||||
|
||||
} else if (type == 6 || type == 7) {
|
||||
|
||||
|
||||
IrregularRepetition *rep = new IrregularRepetition ();
|
||||
mm_repetition = rep;
|
||||
|
||||
|
|
@ -1657,7 +1694,7 @@ OASISReader::read_repetition ()
|
|||
|
||||
unsigned long n = 0, m = 0;
|
||||
|
||||
get (n);
|
||||
get (n);
|
||||
get (m);
|
||||
db::Vector dn = get_gdelta ();
|
||||
db::Vector dm = get_gdelta ();
|
||||
|
|
@ -1667,7 +1704,7 @@ OASISReader::read_repetition ()
|
|||
} else if (type == 9) {
|
||||
|
||||
unsigned long n = 0;
|
||||
get (n);
|
||||
get (n);
|
||||
db::Vector dn = get_gdelta ();
|
||||
|
||||
mm_repetition = new RegularRepetition (dn, db::Vector (0, 0), dn == db::Vector () ? 1 : n + 2, 1);
|
||||
|
|
@ -1704,10 +1741,10 @@ OASISReader::read_repetition ()
|
|||
return mm_repetition.get ().size () > 1;
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_placement (unsigned char r,
|
||||
bool xy_absolute,
|
||||
db::Layout &layout,
|
||||
db::Layout &layout,
|
||||
tl::vector<db::CellInstArray> &instances,
|
||||
tl::vector<db::CellInstArrayWithProperties> &instances_with_props)
|
||||
{
|
||||
|
|
@ -1734,7 +1771,7 @@ OASISReader::do_read_placement (unsigned char r,
|
|||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
double mag = 1.0;
|
||||
bool mag_set = false;
|
||||
|
|
@ -1772,7 +1809,7 @@ OASISReader::do_read_placement (unsigned char r,
|
|||
} else {
|
||||
angle = ((m & 0x06) >> 1);
|
||||
}
|
||||
|
||||
|
||||
mirror = (m & 0x01) != 0;
|
||||
|
||||
if (m & 0x20) {
|
||||
|
|
@ -1810,10 +1847,10 @@ OASISReader::do_read_placement (unsigned char r,
|
|||
db::CellInstArray inst;
|
||||
|
||||
if (mag_set || angle < 0) {
|
||||
inst = db::CellInstArray (db::CellInst (mm_placement_cell.get ()),
|
||||
inst = db::CellInstArray (db::CellInst (mm_placement_cell.get ()),
|
||||
db::ICplxTrans (mag, angle_deg, mirror, pos), layout.array_repository (), a, b, (unsigned long) na, (unsigned long) nb);
|
||||
} else {
|
||||
inst = db::CellInstArray (db::CellInst (mm_placement_cell.get ()),
|
||||
inst = db::CellInstArray (db::CellInst (mm_placement_cell.get ()),
|
||||
db::Trans (angle, mirror, pos), layout.array_repository (), a, b, (unsigned long) na, (unsigned long) nb);
|
||||
}
|
||||
|
||||
|
|
@ -1905,9 +1942,9 @@ OASISReader::do_read_placement (unsigned char r,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_text (bool xy_absolute,
|
||||
db::cell_index_type cell_index,
|
||||
db::cell_index_type cell_index,
|
||||
db::Layout &layout)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -1951,7 +1988,7 @@ OASISReader::do_read_text (bool xy_absolute,
|
|||
mm_text_string = get_str ();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m & 0x1) {
|
||||
mm_textlayer = get_uint ();
|
||||
|
|
@ -2030,7 +2067,7 @@ OASISReader::do_read_text (bool xy_absolute,
|
|||
array.insert (db::Vector ());
|
||||
array.insert (points->begin (), points->end ());
|
||||
array.sort ();
|
||||
|
||||
|
||||
if (pp.first) {
|
||||
cell.shapes (ll.second).insert (db::object_with_properties<db::Shape::text_ptr_array_type> (db::Shape::text_ptr_array_type (text_ptr, db::Disp (pos), layout.array_repository ().insert (array)), pp.second));
|
||||
} else {
|
||||
|
|
@ -2078,9 +2115,9 @@ OASISReader::do_read_text (bool xy_absolute,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_rectangle (bool xy_absolute,
|
||||
db::cell_index_type cell_index,
|
||||
db::cell_index_type cell_index,
|
||||
db::Layout &layout)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -2095,13 +2132,13 @@ OASISReader::do_read_rectangle (bool xy_absolute,
|
|||
|
||||
if (m & 0x40) {
|
||||
mm_geometry_w = get_ucoord_as_distance ();
|
||||
}
|
||||
}
|
||||
if (m & 0x80) {
|
||||
mm_geometry_h = mm_geometry_w; // TODO: really?
|
||||
} else {
|
||||
if (m & 0x20) {
|
||||
mm_geometry_h = get_ucoord_as_distance ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m & 0x10) {
|
||||
|
|
@ -2160,7 +2197,7 @@ OASISReader::do_read_rectangle (bool xy_absolute,
|
|||
array.insert (db::Vector ());
|
||||
array.insert (points->begin (), points->end ());
|
||||
array.sort ();
|
||||
|
||||
|
||||
if (pp.first) {
|
||||
cell.shapes (ll.second).insert (db::object_with_properties<db::Shape::box_array_type> (db::Shape::box_array_type (box, db::UnitTrans (), layout.array_repository ().insert (array)), pp.second));
|
||||
} else {
|
||||
|
|
@ -2185,7 +2222,7 @@ OASISReader::do_read_rectangle (bool xy_absolute,
|
|||
}
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
std::pair<bool, db::properties_id_type> pp = read_element_properties (layout.properties_repository (), false);
|
||||
|
||||
if (ll.first) {
|
||||
|
|
@ -2202,7 +2239,7 @@ OASISReader::do_read_rectangle (bool xy_absolute,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_polygon (bool xy_absolute, db::cell_index_type cell_index, db::Layout &layout)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -2290,7 +2327,7 @@ OASISReader::do_read_polygon (bool xy_absolute, db::cell_index_type cell_index,
|
|||
array.insert (db::Vector ());
|
||||
array.insert (points->begin (), points->end ());
|
||||
array.sort ();
|
||||
|
||||
|
||||
if (pp.first) {
|
||||
cell.shapes (ll.second).insert (db::object_with_properties<db::Shape::simple_polygon_ptr_array_type> (db::Shape::simple_polygon_ptr_array_type (poly_ptr, db::Disp (d + pos), layout.array_repository ().insert (array)), pp.second));
|
||||
} else {
|
||||
|
|
@ -2310,7 +2347,7 @@ OASISReader::do_read_polygon (bool xy_absolute, db::cell_index_type cell_index,
|
|||
}
|
||||
++p;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -2345,7 +2382,7 @@ OASISReader::do_read_polygon (bool xy_absolute, db::cell_index_type cell_index,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_path (bool xy_absolute, db::cell_index_type cell_index, db::Layout &layout)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -2459,7 +2496,7 @@ OASISReader::do_read_path (bool xy_absolute, db::cell_index_type cell_index, db:
|
|||
array.insert (db::Vector ());
|
||||
array.insert (points->begin (), points->end ());
|
||||
array.sort ();
|
||||
|
||||
|
||||
if (pp.first) {
|
||||
cell.shapes (ll.second).insert (db::object_with_properties<db::Shape::path_ptr_array_type> (db::Shape::path_ptr_array_type (path_ptr, db::Disp (d + pos), layout.array_repository ().insert (array)), pp.second));
|
||||
} else {
|
||||
|
|
@ -2481,7 +2518,7 @@ OASISReader::do_read_path (bool xy_absolute, db::cell_index_type cell_index, db:
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -2516,7 +2553,7 @@ OASISReader::do_read_path (bool xy_absolute, db::cell_index_type cell_index, db:
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_trapezoid (unsigned char r, bool xy_absolute,db::cell_index_type cell_index, db::Layout &layout)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -2628,7 +2665,7 @@ OASISReader::do_read_trapezoid (unsigned char r, bool xy_absolute,db::cell_index
|
|||
array.insert (db::Vector ());
|
||||
array.insert (points->begin (), points->end ());
|
||||
array.sort ();
|
||||
|
||||
|
||||
if (pp.first) {
|
||||
cell.shapes (ll.second).insert (db::object_with_properties<db::Shape::simple_polygon_ptr_array_type> (db::Shape::simple_polygon_ptr_array_type (poly_ptr, db::Disp (d + pos), layout.array_repository ().insert (array)), pp.second));
|
||||
} else {
|
||||
|
|
@ -2675,7 +2712,7 @@ OASISReader::do_read_trapezoid (unsigned char r, bool xy_absolute,db::cell_index
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_ctrapezoid (bool xy_absolute,db::cell_index_type cell_index, db::Layout &layout)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -2736,21 +2773,21 @@ OASISReader::do_read_ctrapezoid (bool xy_absolute,db::cell_index_type cell_index
|
|||
},
|
||||
// type 1
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, -1, 0, 0 }
|
||||
},
|
||||
// type 2
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 3
|
||||
{
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
|
|
@ -2764,147 +2801,147 @@ OASISReader::do_read_ctrapezoid (bool xy_absolute,db::cell_index_type cell_index
|
|||
},
|
||||
// type 5
|
||||
{
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, -1, 0, 0 }
|
||||
},
|
||||
// type 6
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, -1, 0, 0 }
|
||||
},
|
||||
// type 7
|
||||
{
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, -1, 0, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 8
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, -1, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 9
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, -1, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 10
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 1, 0 }
|
||||
},
|
||||
// type 11
|
||||
{
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 12
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, -1, 1 },
|
||||
{ 1, 0, 1, 0 }
|
||||
},
|
||||
// type 13
|
||||
{
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, -1, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 14
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, -1, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 1, 0 }
|
||||
},
|
||||
// type 15
|
||||
{
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, -1, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 16
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 }
|
||||
},
|
||||
// type 17
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 1, 0, 1, 0 },
|
||||
{ 0, 0, 0, 0 }
|
||||
},
|
||||
// type 18
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 1, 0, 1, 0 },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 }
|
||||
},
|
||||
// type 19
|
||||
{
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 1, 0, 1, 0 },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 0, 0, 1, 0 }
|
||||
},
|
||||
// type 20
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 1, 0, 1 },
|
||||
{ 0, 2, 0, 0 },
|
||||
{ 0, 0, 0, 0 }
|
||||
},
|
||||
// type 21
|
||||
{
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 0, 2, 0, 1 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 1 }
|
||||
},
|
||||
// type 22
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 2, 0 },
|
||||
{ 1, 0, 1, 0 },
|
||||
{ 0, 0, 0, 0 }
|
||||
},
|
||||
// type 23
|
||||
{
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 1, 0, 2, 0 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 24
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 1 },
|
||||
{ 1, 0, 0, 1 },
|
||||
{ 1, 0, 0, 0 }
|
||||
},
|
||||
// type 25
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 1, 0, 1, 0 },
|
||||
{ 1, 0, 0, 0 }
|
||||
|
|
@ -2930,7 +2967,7 @@ OASISReader::do_read_ctrapezoid (bool xy_absolute,db::cell_index_type cell_index
|
|||
if (m[3] != 0) y += m[3] * mm_geometry_h.get ();
|
||||
|
||||
pts [i] = db::Point (x, y);
|
||||
|
||||
|
||||
if (x > w) w = x;
|
||||
if (y > h) h = y;
|
||||
|
||||
|
|
@ -2987,7 +3024,7 @@ OASISReader::do_read_ctrapezoid (bool xy_absolute,db::cell_index_type cell_index
|
|||
array.insert (db::Vector ());
|
||||
array.insert (points->begin (), points->end ());
|
||||
array.sort ();
|
||||
|
||||
|
||||
if (pp.first) {
|
||||
cell.shapes (ll.second).insert (db::object_with_properties<db::Shape::simple_polygon_ptr_array_type> (db::Shape::simple_polygon_ptr_array_type (poly_ptr, db::Disp (d + pos), layout.array_repository ().insert (array)), pp.second));
|
||||
} else {
|
||||
|
|
@ -3034,7 +3071,7 @@ OASISReader::do_read_ctrapezoid (bool xy_absolute,db::cell_index_type cell_index
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_circle (bool xy_absolute, db::cell_index_type cell_index, db::Layout &layout)
|
||||
{
|
||||
unsigned char m = get_byte ();
|
||||
|
|
@ -3123,7 +3160,7 @@ OASISReader::do_read_circle (bool xy_absolute, db::cell_index_type cell_index, d
|
|||
array.insert (db::Vector ());
|
||||
array.insert (points->begin (), points->end ());
|
||||
array.sort ();
|
||||
|
||||
|
||||
if (pp.first) {
|
||||
cell.shapes (ll.second).insert (db::object_with_properties<db::Shape::path_ptr_array_type> (db::Shape::path_ptr_array_type (path_ptr, db::Disp (pos), layout.array_repository ().insert (array)), pp.second));
|
||||
} else {
|
||||
|
|
@ -3206,10 +3243,10 @@ OASISReader::reset_modal_variables ()
|
|||
mm_last_value_list.reset ();
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
OASISReader::do_read_cell (db::cell_index_type cell_index, db::Layout &layout)
|
||||
{
|
||||
// clears current instance list
|
||||
// clears current instance list
|
||||
m_instances.clear ();
|
||||
m_instances_with_props.clear ();
|
||||
|
||||
|
|
@ -3376,11 +3413,11 @@ OASISReader::do_read_cell (db::cell_index_type cell_index, db::Layout &layout)
|
|||
layout.cell (cell_index).prop_id (layout.properties_repository ().properties_id (cell_properties));
|
||||
}
|
||||
|
||||
// insert all instances collected (inserting them once is
|
||||
// insert all instances collected (inserting them once is
|
||||
// more effective than doing this every time)
|
||||
if (! m_instances.empty ()) {
|
||||
layout.cell (cell_index).insert (m_instances.begin (), m_instances.end ());
|
||||
// clear immediately, because if the cell is cleared before the instances are deleted, the
|
||||
// clear immediately, because if the cell is cleared before the instances are deleted, the
|
||||
// array pointers (living in the repository) may no longer be valid
|
||||
m_instances.clear ();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue