From 315bcdd0165e921b660ec972e0a49f2ec81644e2 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 7 Jan 2019 23:33:57 +0100 Subject: [PATCH] WIP: bugfixed netlist extractor with global nets. --- src/db/db/dbHierNetworkProcessor.cc | 1 + src/db/unit_tests/dbLayoutToNetlistTests.cc | 100 +++++++++--------- .../algo/device_extract_au3_with_rec_nets.gds | Bin 49126 -> 49146 bytes .../algo/device_extract_au4_with_rec_nets.gds | Bin 0 -> 51962 bytes testdata/algo/hc_test_au16.gds | Bin 5570 -> 4506 bytes testdata/algo/hc_test_au16b.gds | Bin 4874 -> 3978 bytes 6 files changed, 52 insertions(+), 49 deletions(-) create mode 100644 testdata/algo/device_extract_au4_with_rec_nets.gds diff --git a/src/db/db/dbHierNetworkProcessor.cc b/src/db/db/dbHierNetworkProcessor.cc index 587f83790..91c5aaab0 100644 --- a/src/db/db/dbHierNetworkProcessor.cc +++ b/src/db/db/dbHierNetworkProcessor.cc @@ -106,6 +106,7 @@ Connectivity::connect_global (unsigned int l, const std::string &gn) { size_t id = global_net_id (gn); m_global_connections [l].insert (id); + m_all_layers.insert (l); return id; } diff --git a/src/db/unit_tests/dbLayoutToNetlistTests.cc b/src/db/unit_tests/dbLayoutToNetlistTests.cc index 565dc49fd..85aa1c411 100644 --- a/src/db/unit_tests/dbLayoutToNetlistTests.cc +++ b/src/db/unit_tests/dbLayoutToNetlistTests.cc @@ -1001,15 +1001,15 @@ TEST(3_GlobalNetConnections) // compare netlist as string EXPECT_EQ (l2n.netlist ()->to_string (), "Circuit RINGO ():\n" - " XINV2PAIR $1 ($1=VSS,$2=VSS,$3=FB,$4=VDD,$5=VSS,$6=$I7,$7=OSC,$8=VDD)\n" - " XINV2PAIR $2 ($1=VSS,$2=VSS,$3=$I22,$4=VDD,$5=VSS,$6=FB,$7=$I13,$8=VDD)\n" - " XINV2PAIR $3 ($1=VSS,$2=VSS,$3=$I23,$4=VDD,$5=VSS,$6=$I13,$7=$I5,$8=VDD)\n" - " XINV2PAIR $4 ($1=VSS,$2=VSS,$3=$I24,$4=VDD,$5=VSS,$6=$I5,$7=$I6,$8=VDD)\n" - " XINV2PAIR $5 ($1=VSS,$2=VSS,$3=$I25,$4=VDD,$5=VSS,$6=$I6,$7=$I7,$8=VDD)\n" - "Circuit INV2PAIR ($1=$I10,$2=$I9,$3=$I8,$4=$I6,$5=$I5,$6=$I3,$7=$I2,$8=$I1):\n" - " XINV2 $1 ($1=$I1,IN=$I4,$3=$I8,BULK=$I10,OUT=$I2,VSS=$I5,VDD=$I6)\n" - " XINV2 $2 ($1=$I1,IN=$I3,$3=$I7,BULK=$I9,OUT=$I4,VSS=$I5,VDD=$I6)\n" - "Circuit INV2 ($1=$1,IN=IN,$3=$3,BULK=BULK,OUT=OUT,VSS=VSS,VDD=VDD):\n" + " XINV2PAIR $1 (BULK='BULK,VSS',$2=FB,$3=VDD,$4='BULK,VSS',$5=$I7,$6=OSC,$7=VDD)\n" + " XINV2PAIR $2 (BULK='BULK,VSS',$2=$I22,$3=VDD,$4='BULK,VSS',$5=FB,$6=$I13,$7=VDD)\n" + " XINV2PAIR $3 (BULK='BULK,VSS',$2=$I23,$3=VDD,$4='BULK,VSS',$5=$I13,$6=$I5,$7=VDD)\n" + " XINV2PAIR $4 (BULK='BULK,VSS',$2=$I24,$3=VDD,$4='BULK,VSS',$5=$I5,$6=$I6,$7=VDD)\n" + " XINV2PAIR $5 (BULK='BULK,VSS',$2=$I25,$3=VDD,$4='BULK,VSS',$5=$I6,$6=$I7,$7=VDD)\n" + "Circuit INV2PAIR (BULK=BULK,$2=$I8,$3=$I6,$4=$I5,$5=$I3,$6=$I2,$7=$I1):\n" + " XINV2 $1 ($1=$I1,IN=$I3,$3=$I7,OUT=$I4,VSS=$I5,VDD=$I6,BULK=BULK)\n" + " XINV2 $2 ($1=$I1,IN=$I4,$3=$I8,OUT=$I2,VSS=$I5,VDD=$I6,BULK=BULK)\n" + "Circuit INV2 ($1=$1,IN=IN,$3=$3,OUT=OUT,VSS=VSS,VDD=VDD,BULK=BULK):\n" " DPMOS $1 (S=$3,G=IN,D=VDD) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" " DPMOS $2 (S=VDD,G=$3,D=OUT) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" " DNMOS $3 (S=$3,G=IN,D=VSS) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" @@ -1038,7 +1038,7 @@ TEST(3_GlobalNetConnections) EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal2, db::DPoint (-2.0, 1.8))), "(null)"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (-1.5, 1.8))), "RINGO:FB"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (24.5, 1.8))), "RINGO:OSC"); - EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (5.3, 0.0))), "RINGO:VSS"); + EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (5.3, 0.0))), "RINGO:BULK,VSS"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (2.6, 1.0))), "RINGO:$I22"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "INV2PAIR:$I4"); @@ -1052,16 +1052,16 @@ TEST(3_GlobalNetConnections) // compare netlist as string EXPECT_EQ (l2n.netlist ()->to_string (), - "Circuit RINGO (FB=FB,OSC=OSC,VDD=VDD,VSS=VSS):\n" - " XINV2PAIR $1 ($1=VSS,$2=VSS,$3=FB,$4=VDD,$5=VSS,$6=$I7,$7=OSC,$8=VDD)\n" - " XINV2PAIR $2 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=FB,$7=$I13,$8=VDD)\n" - " XINV2PAIR $3 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=$I13,$7=$I5,$8=VDD)\n" - " XINV2PAIR $4 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=$I5,$7=$I6,$8=VDD)\n" - " XINV2PAIR $5 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=$I6,$7=$I7,$8=VDD)\n" - "Circuit INV2PAIR ($1=$I10,$2=$I9,$3=$I8,$4=$I6,$5=$I5,$6=$I3,$7=$I2,$8=$I1):\n" - " XINV2 $1 ($1=$I1,IN=$I4,$3=$I8,BULK=$I10,OUT=$I2,VSS=$I5,VDD=$I6)\n" - " XINV2 $2 ($1=$I1,IN=$I3,$3=(null),BULK=$I9,OUT=$I4,VSS=$I5,VDD=$I6)\n" - "Circuit INV2 ($1=(null),IN=IN,$3=$3,BULK=(null),OUT=OUT,VSS=VSS,VDD=VDD):\n" + "Circuit RINGO (FB=FB,OSC=OSC,VDD=VDD,'BULK,VSS'='BULK,VSS'):\n" + " XINV2PAIR $1 (BULK='BULK,VSS',$2=FB,$3=VDD,$4='BULK,VSS',$5=$I7,$6=OSC,$7=VDD)\n" + " XINV2PAIR $2 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=FB,$6=$I13,$7=VDD)\n" + " XINV2PAIR $3 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=$I13,$6=$I5,$7=VDD)\n" + " XINV2PAIR $4 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=$I5,$6=$I6,$7=VDD)\n" + " XINV2PAIR $5 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=$I6,$6=$I7,$7=VDD)\n" + "Circuit INV2PAIR (BULK=BULK,$2=$I8,$3=$I6,$4=$I5,$5=$I3,$6=$I2,$7=$I1):\n" + " XINV2 $1 ($1=$I1,IN=$I3,$3=(null),OUT=$I4,VSS=$I5,VDD=$I6,BULK=BULK)\n" + " XINV2 $2 ($1=$I1,IN=$I4,$3=$I8,OUT=$I2,VSS=$I5,VDD=$I6,BULK=BULK)\n" + "Circuit INV2 ($1=(null),IN=IN,$3=$3,OUT=OUT,VSS=VSS,VDD=VDD,BULK=(null)):\n" " DPMOS $1 (S=$3,G=IN,D=VDD) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" " DPMOS $2 (S=VDD,G=$3,D=OUT) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" " DNMOS $3 (S=$3,G=IN,D=VSS) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" @@ -1245,6 +1245,7 @@ TEST(4_GlobalNetDeviceExtraction) dump_map [&rnsd ] = ly.insert_layer (db::LayerProperties (211, 0)); dump_map [&rptie ] = ly.insert_layer (db::LayerProperties (212, 0)); dump_map [&rntie ] = ly.insert_layer (db::LayerProperties (213, 0)); + dump_map [rbulk.get () ] = ly.insert_layer (db::LayerProperties (214, 0)); dump_map [rnwell.get () ] = ly.insert_layer (db::LayerProperties (201, 0)); dump_map [rpoly.get () ] = ly.insert_layer (db::LayerProperties (203, 0)); dump_map [rdiff_cont.get ()] = ly.insert_layer (db::LayerProperties (204, 0)); @@ -1262,6 +1263,7 @@ TEST(4_GlobalNetDeviceExtraction) dump_map [&rnsd ] = ly.insert_layer (db::LayerProperties (311, 0)); dump_map [&rptie ] = ly.insert_layer (db::LayerProperties (312, 0)); dump_map [&rntie ] = ly.insert_layer (db::LayerProperties (313, 0)); + dump_map [rbulk.get () ] = ly.insert_layer (db::LayerProperties (314, 0)); dump_map [rnwell.get () ] = ly.insert_layer (db::LayerProperties (301, 0)); dump_map [rpoly.get () ] = ly.insert_layer (db::LayerProperties (303, 0)); dump_map [rdiff_cont.get ()] = ly.insert_layer (db::LayerProperties (304, 0)); @@ -1275,19 +1277,19 @@ TEST(4_GlobalNetDeviceExtraction) // compare netlist as string EXPECT_EQ (l2n.netlist ()->to_string (), "Circuit RINGO ():\n" - " XINV2PAIR $1 ($1=VSS,$2=VSS,$3=FB,$4=VDD,$5=VSS,$6=$I7,$7=OSC,$8=VDD)\n" - " XINV2PAIR $2 ($1=VSS,$2=VSS,$3=$I22,$4=VDD,$5=VSS,$6=FB,$7=$I13,$8=VDD)\n" - " XINV2PAIR $3 ($1=VSS,$2=VSS,$3=$I23,$4=VDD,$5=VSS,$6=$I13,$7=$I5,$8=VDD)\n" - " XINV2PAIR $4 ($1=VSS,$2=VSS,$3=$I24,$4=VDD,$5=VSS,$6=$I5,$7=$I6,$8=VDD)\n" - " XINV2PAIR $5 ($1=VSS,$2=VSS,$3=$I25,$4=VDD,$5=VSS,$6=$I6,$7=$I7,$8=VDD)\n" - "Circuit INV2PAIR ($1=$I10,$2=$I9,$3=$I8,$4=$I6,$5=$I5,$6=$I3,$7=$I2,$8=$I1):\n" - " XINV2 $1 ($1=$I1,IN=$I4,$3=$I8,BULK=$I10,OUT=$I2,VSS=$I5,VDD=$I6)\n" - " XINV2 $2 ($1=$I1,IN=$I3,$3=$I7,BULK=$I9,OUT=$I4,VSS=$I5,VDD=$I6)\n" - "Circuit INV2 ($1=$1,IN=IN,$3=$3,BULK=BULK,OUT=OUT,VSS=VSS,VDD=VDD):\n" - " DPMOS $1 (S=$3,G=IN,D=VDD) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" - " DPMOS $2 (S=VDD,G=$3,D=OUT) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" - " DNMOS $3 (S=$3,G=IN,D=VSS) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" - " DNMOS $4 (S=VSS,G=$3,D=OUT) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" + " XINV2PAIR $1 (BULK='BULK,VSS',$2=FB,$3=VDD,$4='BULK,VSS',$5=$I7,$6=OSC,$7=VDD)\n" + " XINV2PAIR $2 (BULK='BULK,VSS',$2=$I22,$3=VDD,$4='BULK,VSS',$5=FB,$6=$I13,$7=VDD)\n" + " XINV2PAIR $3 (BULK='BULK,VSS',$2=$I23,$3=VDD,$4='BULK,VSS',$5=$I13,$6=$I5,$7=VDD)\n" + " XINV2PAIR $4 (BULK='BULK,VSS',$2=$I24,$3=VDD,$4='BULK,VSS',$5=$I5,$6=$I6,$7=VDD)\n" + " XINV2PAIR $5 (BULK='BULK,VSS',$2=$I25,$3=VDD,$4='BULK,VSS',$5=$I6,$6=$I7,$7=VDD)\n" + "Circuit INV2PAIR (BULK=BULK,$2=$I8,$3=$I6,$4=$I5,$5=$I3,$6=$I2,$7=$I1):\n" + " XINV2 $1 ($1=$I1,IN=$I3,$3=$I7,OUT=$I4,VSS=$I5,VDD=$I6,BULK=BULK)\n" + " XINV2 $2 ($1=$I1,IN=$I4,$3=$I8,OUT=$I2,VSS=$I5,VDD=$I6,BULK=BULK)\n" + "Circuit INV2 ($1=$1,IN=IN,$3=$3,OUT=OUT,VSS=VSS,VDD=VDD,BULK=BULK):\n" + " DPMOS $1 (S=$3,G=IN,D=VDD,B=$1) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" + " DPMOS $2 (S=VDD,G=$3,D=OUT,B=$1) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" + " DNMOS $3 (S=$3,G=IN,D=VSS,B=BULK) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" + " DNMOS $4 (S=VSS,G=$3,D=OUT,B=BULK) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" " XTRANS $1 ($1=$3,$2=VSS,$3=IN)\n" " XTRANS $2 ($1=$3,$2=VDD,$3=IN)\n" " XTRANS $3 ($1=VDD,$2=OUT,$3=$3)\n" @@ -1300,7 +1302,7 @@ TEST(4_GlobalNetDeviceExtraction) std::string au = tl::testsrc (); au = tl::combine_path (au, "testdata"); au = tl::combine_path (au, "algo"); - au = tl::combine_path (au, "device_extract_au3_with_rec_nets.gds"); + au = tl::combine_path (au, "device_extract_au4_with_rec_nets.gds"); db::compare_layouts (_this, ly, au); @@ -1312,7 +1314,7 @@ TEST(4_GlobalNetDeviceExtraction) EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal2, db::DPoint (-2.0, 1.8))), "(null)"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (-1.5, 1.8))), "RINGO:FB"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (24.5, 1.8))), "RINGO:OSC"); - EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (5.3, 0.0))), "RINGO:VSS"); + EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (5.3, 0.0))), "RINGO:BULK,VSS"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (2.6, 1.0))), "RINGO:$I22"); EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "INV2PAIR:$I4"); @@ -1326,20 +1328,20 @@ TEST(4_GlobalNetDeviceExtraction) // compare netlist as string EXPECT_EQ (l2n.netlist ()->to_string (), - "Circuit RINGO (FB=FB,OSC=OSC,VDD=VDD,VSS=VSS):\n" - " XINV2PAIR $1 ($1=VSS,$2=VSS,$3=FB,$4=VDD,$5=VSS,$6=$I7,$7=OSC,$8=VDD)\n" - " XINV2PAIR $2 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=FB,$7=$I13,$8=VDD)\n" - " XINV2PAIR $3 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=$I13,$7=$I5,$8=VDD)\n" - " XINV2PAIR $4 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=$I5,$7=$I6,$8=VDD)\n" - " XINV2PAIR $5 ($1=VSS,$2=VSS,$3=(null),$4=VDD,$5=VSS,$6=$I6,$7=$I7,$8=VDD)\n" - "Circuit INV2PAIR ($1=$I10,$2=$I9,$3=$I8,$4=$I6,$5=$I5,$6=$I3,$7=$I2,$8=$I1):\n" - " XINV2 $1 ($1=$I1,IN=$I4,$3=$I8,BULK=$I10,OUT=$I2,VSS=$I5,VDD=$I6)\n" - " XINV2 $2 ($1=$I1,IN=$I3,$3=(null),BULK=$I9,OUT=$I4,VSS=$I5,VDD=$I6)\n" - "Circuit INV2 ($1=(null),IN=IN,$3=$3,BULK=(null),OUT=OUT,VSS=VSS,VDD=VDD):\n" - " DPMOS $1 (S=$3,G=IN,D=VDD) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" - " DPMOS $2 (S=VDD,G=$3,D=OUT) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" - " DNMOS $3 (S=$3,G=IN,D=VSS) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" - " DNMOS $4 (S=VSS,G=$3,D=OUT) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" + "Circuit RINGO (FB=FB,OSC=OSC,VDD=VDD,'BULK,VSS'='BULK,VSS'):\n" + " XINV2PAIR $1 (BULK='BULK,VSS',$2=FB,$3=VDD,$4='BULK,VSS',$5=$I7,$6=OSC,$7=VDD)\n" + " XINV2PAIR $2 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=FB,$6=$I13,$7=VDD)\n" + " XINV2PAIR $3 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=$I13,$6=$I5,$7=VDD)\n" + " XINV2PAIR $4 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=$I5,$6=$I6,$7=VDD)\n" + " XINV2PAIR $5 (BULK='BULK,VSS',$2=(null),$3=VDD,$4='BULK,VSS',$5=$I6,$6=$I7,$7=VDD)\n" + "Circuit INV2PAIR (BULK=BULK,$2=$I8,$3=$I6,$4=$I5,$5=$I3,$6=$I2,$7=$I1):\n" + " XINV2 $1 ($1=$I1,IN=$I3,$3=(null),OUT=$I4,VSS=$I5,VDD=$I6,BULK=BULK)\n" + " XINV2 $2 ($1=$I1,IN=$I4,$3=$I8,OUT=$I2,VSS=$I5,VDD=$I6,BULK=BULK)\n" + "Circuit INV2 ($1=$1,IN=IN,$3=$3,OUT=OUT,VSS=VSS,VDD=VDD,BULK=BULK):\n" + " DPMOS $1 (S=$3,G=IN,D=VDD,B=$1) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" + " DPMOS $2 (S=VDD,G=$3,D=OUT,B=$1) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" + " DNMOS $3 (S=$3,G=IN,D=VSS,B=BULK) [L=0.25,W=0.95,AS=0.49875,AD=0.26125]\n" + " DNMOS $4 (S=VSS,G=$3,D=OUT,B=BULK) [L=0.25,W=0.95,AS=0.26125,AD=0.49875]\n" ); // do some probing after purging diff --git a/testdata/algo/device_extract_au3_with_rec_nets.gds b/testdata/algo/device_extract_au3_with_rec_nets.gds index 9ce7a8522f323e714516ce1c2ea0cbb35cef025e..e9fbf4d083321a7b09513ba46450c2406f682dee 100644 GIT binary patch delta 1221 zcmaF%pXt|sCM5s_Qwp24D1ZT45|!L$n1$qs>0ZWqhhfNpSp`pc=9er z?Bc7~=VMd9c@@)KMywK1EI1^%*m|++h~c=)gw-e??pUlkChy_F>e$U|cvZ1#*!+YK zhlGp(4v7#!91=Z3mDpV?A$pkwt2h2hKE^KbMXr}|@_PlI$(t2oCx6(+Hu=IfmdPCo zGMfby(|NEO)unqLyHPntI3)bcaYz{0T*Pjah~q=-5*%(gB>s5ekoe&LkVOki+GLPm zV+-oC~|Nc#Y3 z9w5yVYdraXT<>I`M3>0{2{w~?5`kg~4wKJ-a6C{wknV|h*xZx&T>@(uPOFmFz$$TK zQ9m2fb-3O#K zHUZ^s_Qwp2K%O9j1_L`Xd!mx6FgD?+SggXQ?qU<3yo(X5 z_~sbqxs2E}Z02FbA+d+87psoRtC;3vH7SPUE)!M>AMRM}Chg(D?$|ZFs#rB_e!_=C zLPh|GM2H{`i5{U!?5>p%z088u8~-F9W0&|M*ULEht%CC82SQwv9TZq6_bSA07Eny* z!D>vG?s@FSz- zKFHJ0-9J7oIC$~{bFsxjp&XMh#Tid_jq{y+Db`_f5D-s_bC@gy#FKz*p;+U|b7idz3 X%4GiSDU*G-^H1KSAijD2_Gk_Om9oZE diff --git a/testdata/algo/device_extract_au4_with_rec_nets.gds b/testdata/algo/device_extract_au4_with_rec_nets.gds new file mode 100644 index 0000000000000000000000000000000000000000..7f0110515f3ba96ed0deab151e7b093c384df61d GIT binary patch literal 51962 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 literal 0 HcmV?d00001 diff --git a/testdata/algo/hc_test_au16.gds b/testdata/algo/hc_test_au16.gds index 77d3c83edd3076e9aa32cbdd3e8595f89be73df8..96153688c45d5532132afe6fdbd6327fb4902fe6 100644 GIT binary patch delta 150 zcmX@4Jxf`MfsKKQDS|gCsJ0qLR8GhTz7isZ5xno0uD!F-12| hVmr-W5dc7n85aNm delta 146 zcmbQGd`Me~fsKKQDS|ylSuU}IonieQjoWMY5Jz{tSPAkHAeAc@SLsH854A-FMWDifyYCT31%Owr9! zY_l0Lg(n|lzqDC`vw?B31UKX689WY*lOy;JY@WdnVhA=&mJnLQ#?HXN!omOm&Bq(X delta 167 zcmeB@?^07@U}IonieQjoWMY5Jz{tSPz`&ryV1mq^sH854A-FMWDifyYCT31%Owr9! yY_l0Lg(n|lzqD9_gK6^&&IZQKGq?^gZoa|o0A%qTU|f8ImvQn8zBiLy_}u{C-yfg=