diff --git a/src/db/db/dbText.h b/src/db/db/dbText.h index f69000a1f..61b787ce2 100644 --- a/src/db/db/dbText.h +++ b/src/db/db/dbText.h @@ -676,11 +676,11 @@ public: typedef typename Tr::target_coord_type target_coord_type; size_t p = (size_t) mp_ptr; if (p & 1) { - return text (reinterpret_cast (p - 1), simple_trans ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point ()), t.ctrans (m_size), m_font); + return text (reinterpret_cast (p - 1), simple_trans ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point ()), t.ctrans (m_size), m_font, m_halign, m_valign); } else if (mp_ptr) { - return text (mp_ptr, simple_trans ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point ()), t.ctrans (m_size), m_font); + return text (mp_ptr, simple_trans ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point ()), t.ctrans (m_size), m_font, m_halign, m_valign); } else { - return text (simple_trans ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point ()), t.ctrans (m_size), m_font); + return text (simple_trans ((t.fp_trans () * m_trans.fp_trans ()).rot (), t (point_type () + m_trans.disp ()) - point ()), t.ctrans (m_size), m_font, m_halign, m_valign); } } diff --git a/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc b/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc index b1e6fe3a2..25ef4026e 100644 --- a/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc +++ b/src/plugins/streamers/magic/db_plugin/dbMAGReader.cc @@ -350,6 +350,14 @@ MAGReader::do_read_part (db::Layout &layout, db::cell_index_type cell_index, tl: read_rect (ex, layout, cell_index, current_layer); } + } else if (ex.test ("tri")) { + + if (in_labels) { + error (tl::to_string (tr ("'rect' statement inside labels section"))); + } else if (valid_layer) { + read_tri (ex, layout, cell_index, current_layer); + } + } else if (ex.test ("rlabel")) { if (! in_labels) { @@ -378,9 +386,27 @@ MAGReader::do_merge_part (Layout &layout, cell_index_type cell_index) sp.enable_progress (tl::to_string (tr ("Merging shapes for MAG reader"))); } + std::vector saved_texts; + for (db::Layout::layer_iterator l = layout.begin_layers (); l != layout.end_layers (); ++l) { + unsigned int li = (unsigned int) (*l).first; - sp.merge (layout, cell, li, cell.shapes (li), false); + db::Shapes &shapes = cell.shapes (li); + + // save texts before merge + saved_texts.clear (); + for (db::Shapes::shape_iterator t = shapes.begin (db::ShapeIterator::Texts); ! t.at_end (); ++t) { + saved_texts.push_back (db::Text ()); + t->text (saved_texts.back ()); + } + + sp.merge (layout, cell, li, shapes, false); + + // re-insert the texts + for (std::vector::const_iterator t = saved_texts.begin (); t != saved_texts.end (); ++t) { + shapes.insert (*t); + } + } } @@ -398,6 +424,52 @@ MAGReader::read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_in layout.cell (cell_index).shapes (layer).insert ((box * m_lambda).transformed (m_dbu_trans_inv)); } +void +MAGReader::read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer) +{ + double l, b, r, t; + ex.read (l); + ex.read (b); + ex.read (r); + ex.read (t); + + bool s = false, e = false; + while (! ex.at_end ()) { + if (ex.test ("s")) { + s = true; + } else if (ex.test ("e")) { + e = true; + } else { + break; + } + } + ex.expect_end (); + + std::vector pts; + + if (s && e) { + pts.push_back (db::Point (l, b)); + pts.push_back (db::Point (r, t)); + pts.push_back (db::Point (r, b)); + } else if (s) { + pts.push_back (db::Point (l, b)); + pts.push_back (db::Point (l, t)); + pts.push_back (db::Point (r, b)); + } else if (e) { + pts.push_back (db::Point (r, b)); + pts.push_back (db::Point (l, t)); + pts.push_back (db::Point (r, t)); + } else { + pts.push_back (db::Point (l, b)); + pts.push_back (db::Point (l, t)); + pts.push_back (db::Point (r, t)); + } + + db::SimplePolygon poly; + poly.assign_hull (pts.begin (), pts.end ()); + layout.cell (cell_index).shapes (layer).insert ((poly * m_lambda).transformed (m_dbu_trans_inv)); +} + void MAGReader::read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index) { @@ -419,19 +491,27 @@ MAGReader::read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_ double x = 0.5 * (l + r); double y = 0.5 * (b + t); if (pos == 2 || pos == 3 || pos == 4) { + text.halign (db::HAlignRight); x = r; } else if (pos == 6 || pos == 7 || pos == 8) { + text.halign (db::HAlignLeft); x = l; + } else { + text.halign (db::HAlignCenter); } if (pos == 1 || pos == 2 || pos == 8) { + text.valign (db::VAlignTop); y = t; } else if (pos == 4 || pos == 5 || pos == 6) { + text.valign (db::VAlignBottom); y = b; + } else { + text.valign (db::VAlignCenter); } text.move (db::DVector (x, y)); - if (true || lname != "space") { // @@@ really? "space"? ignore it? + if (true || lname != "space") { // really? "space"? ignore it? std::pair ll = open_layer (layout, lname); if (ll.first) { layout.cell (cell_index).shapes (ll.second).insert ((text * m_lambda).transformed (m_dbu_trans_inv)); @@ -500,7 +580,7 @@ MAGReader::read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, L na = (unsigned long) std::max (0, xhi - xlo + 1); a = db::DVector (xsep, 0) * m_lambda; nb = (unsigned long) std::max (0, yhi - ylo + 1); - b = db::DVector (ysep, 0) * m_lambda; + b = db::DVector (0, ysep) * m_lambda; } else if (ex2.test ("timestamp")) { // ignored @@ -527,6 +607,9 @@ MAGReader::read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, L // create the instance + a = trans * a; + b = trans * b; + db::cell_index_type ci = cell_from_path (filename, layout); db::ICplxTrans itrans = m_dbu_trans_inv * trans * db::CplxTrans (m_dbu); diff --git a/src/plugins/streamers/magic/db_plugin/dbMAGReader.h b/src/plugins/streamers/magic/db_plugin/dbMAGReader.h index 998ee3f72..67d6e4263 100644 --- a/src/plugins/streamers/magic/db_plugin/dbMAGReader.h +++ b/src/plugins/streamers/magic/db_plugin/dbMAGReader.h @@ -151,6 +151,7 @@ private: std::string cell_name_from_path (const std::string &path); db::cell_index_type cell_from_path (const std::string &path, Layout &layout); void read_rect (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer); + void read_tri (tl::Extractor &ex, Layout &layout, cell_index_type cell_index, unsigned int layer); void read_rlabel (tl::Extractor &ex, Layout &layout, cell_index_type cell_index); void read_cell_instance (tl::Extractor &ex, tl::TextInputStream &stream, Layout &layout, cell_index_type cell_index); };