From 9688da9ffd2c97b10e006a471e766dc290db42a8 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 19 Dec 2020 21:28:22 +0100 Subject: [PATCH] WIP: test for multimapping in LEF/DEF --- src/db/db/dbCommonReader.cc | 28 ------------------ src/db/db/dbCommonReader.h | 3 -- src/db/db/dbReader.cc | 27 +++++++++++++++++ src/db/db/dbReader.h | 8 +++++ .../lefdef/db_plugin/dbLEFDEFImporter.cc | 14 +++++---- .../lefdef/unit_tests/dbLEFDEFImportTests.cc | 18 +++++++++++ testdata/lefdef/multimap/.test.def.swp | Bin 0 -> 12288 bytes testdata/lefdef/multimap/au.oas.gz | Bin 0 -> 598 bytes testdata/lefdef/multimap/test.def | 28 ++++++++++++++++++ 9 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 testdata/lefdef/multimap/.test.def.swp create mode 100644 testdata/lefdef/multimap/au.oas.gz create mode 100644 testdata/lefdef/multimap/test.def diff --git a/src/db/db/dbCommonReader.cc b/src/db/db/dbCommonReader.cc index 0bf21814a..a64de5f72 100644 --- a/src/db/db/dbCommonReader.cc +++ b/src/db/db/dbCommonReader.cc @@ -32,34 +32,6 @@ namespace db // --------------------------------------------------------------- // Common reader implementation -DB_PUBLIC void -join_layer_names (std::string &s, const std::string &n) -{ - if (s == n) { - return; - } - - if (! s.empty ()) { - - size_t i = s.find (n); - if (i != std::string::npos && (i == 0 || s.c_str ()[i - 1] == ';')) { - char after = s.c_str ()[i + n.size ()]; - if (after == 0 || after == ';') { - // n is already contained in s - return; - } - } - - s += ";"; - - } - - s += n; -} - -// --------------------------------------------------------------- -// Common reader implementation - static const size_t null_id = std::numeric_limits::max (); CommonReader::CommonReader () diff --git a/src/db/db/dbCommonReader.h b/src/db/db/dbCommonReader.h index cf53f1895..81d361672 100644 --- a/src/db/db/dbCommonReader.h +++ b/src/db/db/dbCommonReader.h @@ -31,9 +31,6 @@ namespace db { -DB_PUBLIC void -join_layer_names (std::string &s, const std::string &n); - /** * @brief The CellConflictResolution enum */ diff --git a/src/db/db/dbReader.cc b/src/db/db/dbReader.cc index fc6f13adb..2ac8add6b 100644 --- a/src/db/db/dbReader.cc +++ b/src/db/db/dbReader.cc @@ -30,6 +30,33 @@ namespace db { +// --------------------------------------------------------------- + +DB_PUBLIC void +join_layer_names (std::string &s, const std::string &n) +{ + if (s == n) { + return; + } + + if (! s.empty ()) { + + size_t i = s.find (n); + if (i != std::string::npos && (i == 0 || s.c_str ()[i - 1] == ';')) { + char after = s.c_str ()[i + n.size ()]; + if (after == 0 || after == ';') { + // n is already contained in s + return; + } + } + + s += ";"; + + } + + s += n; +} + // --------------------------------------------------------------- // ReaderBase implementation diff --git a/src/db/db/dbReader.h b/src/db/db/dbReader.h index bab39df87..65c2ebf0d 100644 --- a/src/db/db/dbReader.h +++ b/src/db/db/dbReader.h @@ -54,6 +54,14 @@ public: { } }; +/** + * @brief Joins layer names into a single, combined layer + * @param s The first layer name and output + * @param n The name to add + */ +DB_PUBLIC void +join_layer_names (std::string &s, const std::string &n); + /** * @brief The generic reader base class */ diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc index b4fc56598..e3a90c6ee 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc @@ -1359,18 +1359,22 @@ std::set LEFDEFReaderState::open_layer_uncached(db::Layout &layout } } - bool found = false; + int lfound = -1; if (lp_new.layer >= 0 && lp_new.datatype >= 0) { - for (db::Layout::layer_iterator i = layout.begin_layers (); i != layout.end_layers () && ! found; ++i) { + for (db::Layout::layer_iterator i = layout.begin_layers (); i != layout.end_layers () && lfound < 0; ++i) { if ((*i).second->log_equal (lp_new)) { - found = true; - res.insert ((*i).first); + lfound = int ((*i).first); } } } - if (! found) { + if (lfound < 0) { res.insert (layout.insert_layer (lp_new)); + } else { + res.insert ((unsigned int) lfound); + db::LayerProperties lp_org = layout.get_properties ((unsigned int) lfound); + join_layer_names (lp_org.name, name); + layout.set_properties ((unsigned int) lfound, lp_org); } if (l == ll.end ()) { diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index c46067119..eba689a5c 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -724,6 +724,24 @@ TEST(118_density) run_test (_this, "density", "read:in.lef", "au.oas.gz", default_options (), false); } +TEST(119_multimapping) +{ + db::LEFDEFReaderOptions options = default_options (); + db::LayerMap lm = db::LayerMap::from_string_file_format ("(M1:1/0)\n(M2:3/0)\n+(M1:100/0)\n+(M2:100/0)\n(VIA1:2/0)"); + options.set_layer_map (lm); + + db::LayerMap lm_read = run_test (_this, "multimap", "def:test.def", "au.oas.gz", options, false); + EXPECT_EQ (lm_read.to_string (), + "layer_map(" + "'OUTLINE : OUTLINE (4/0)';" + "'+M1.VIA : M1 (1/0)';" + "'+M1.VIA;M2.VIA : \\'M1;M2\\' (100/0)';" + "'+M2.VIA : M2 (3/0)';" + "'VIA1.VIA : VIA1 (2/0)'" + ")" + ) +} + TEST(200_lefdef_plugin) { db::Layout ly; diff --git a/testdata/lefdef/multimap/.test.def.swp b/testdata/lefdef/multimap/.test.def.swp new file mode 100644 index 0000000000000000000000000000000000000000..736b58e7c8210923ca3ae77b5515507a33796e9a GIT binary patch literal 12288 zcmeI2F>ljA6vwZK31~sEFfcrVgc?<;?W83|ncUd4CpC6zJE>YgmXo+m)TA|uJ9GfP z2ooQJi3N#)g$X7Q3p<|x{^ulWg{soE=$-VpefR$N-n(DCL`h3;${MXK8Uo{%5O=q} zg&$_0&HTJNCk9cPc6-rCh0Yt@q|lF&^e{QkgxITTLT$ev9UmU0+8`RG@lZ?SQQC>p zNbASDop@Ip9QD)QAWE{pB3Ay9n8Qqf30#1{tSA)?T^S$b?$e#yjSK8y3lm@hOn?b6 z0Vco%m;e)C0{;tvG?@{vahNNU1Kpe4Xa2fRrhH=pOn?b60Vco%m;e)C0!)AjFaajO z1TGwU55np8MWR*FQEfS)owvNm;e)C0!)AjFaajO1egF5U;>w%fbCdh*}hzJ zgnIO=rc+%vrQ?eQ@&mU{t^Q$q-_S;BG)%)`Jc`q>gZm!&7FEPq(Q$a5q@z4}nkTmr z(B=;1r}kuT5VoQCKxN9ZooQd7CmXIANM|kU#`J<|JFU?$+p5zhLUlxBAYF&rS+}A< z?QYaNFv7|Ft@|1>268S#xa(3 z3@SasB~MLh8e!*XFgPa5B?F5(t!|S6YIdEiJ_ha6;2&Ms9v(hENPpb zZ6YIz!>q2;0%}3e7+|F$8jcKnvZNp2jj^dFtDfs1i!xQj_?5z^&`U!6_Z};&4S!Vz ic(**Ca!;S+;R4CduxWH!_@V0gjKfDB|rrGn#q9V6m{J>C6WUE)3cLR{TlgW|(I zT|zuKSY&u*Akv|J*c8Z!as|hS_y@#0yZZR>a3p7B7Q~n27ce7Od|{rB@jz@CpHiBe zTglDt9~$E0>F3JK!py*f%;9G8HDqQ43PNdaR$oJFUnAxepb&xyRAt1>3|0lExmiGF zGcy52;4EH7QENs9My3rc3)m(y&twv{Okretz`TL;Cd)@gQ43@VW+VwqCPty7ytuy%?AJg literal 0 HcmV?d00001 diff --git a/testdata/lefdef/multimap/test.def b/testdata/lefdef/multimap/test.def new file mode 100644 index 000000000..6381b8523 --- /dev/null +++ b/testdata/lefdef/multimap/test.def @@ -0,0 +1,28 @@ + +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN chip_top ; +UNITS DISTANCE MICRONS 1000 ; +DIEAREA ( 30000 3000 ) ( 10000000 4000 ) ; +VIAS 1 ; + - VIA1_dummy + + RECT M1 ( -200 -140 ) ( 200 140 ) + + RECT VIA1 ( -100 -100 ) ( 100 100 ) + + RECT M2 ( -300 -120 ) ( 300 120 ) ; +END VIAS +SPECIALNETS 1 ; +- dummy + + ROUTED M1 150 + SHAPE IOWIRE ( 40000 3600 ) VIA1_dummy DO 16000 BY 1 STEP 700 0 +; +END SPECIALNETS +SCANCHAINS 77 ; +- chain1_clock1 ++ PARTITION clock1 ++ START block1/bsr_reg_0 Q ++ FLOATING +block1/pgm_cgm_en_reg_reg ( IN SD ) ( OUT QZ ) +block1/start_reset_dd_reg ( IN SD ) ( OUT QZ ) ++ STOP block1/start_reset_d_reg SD ; +END SCANCHAINS +END DESIGN