From e8d54995988c3a0d991ac21cf7b47c4d109e4345 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 8 Nov 2025 00:34:56 +0100 Subject: [PATCH] WIP: LStream samples+test, OASIS writer Current version of LStream code, samples and reader tests. OASIS Writer: now writing points (to degenerated edges) and edge pairs without asserting. --- .../streamers/lstream/db_plugin/lstrReader.cc | 5 +- .../streamers/lstream/db_plugin/lstrWriter.cc | 27 +++- .../streamers/lstream/db_plugin/lstrWriter.h | 4 +- .../unit_tests/dbLStreamReaderTests.cc | 151 ++++++++---------- .../lstream/unit_tests/unit_tests.pro | 2 +- .../oasis/db_plugin/dbOASISWriter.cc | 40 +++++ testdata/lstream/basic.lstr | Bin 0 -> 182 bytes testdata/lstream/basic_au.oas | Bin 0 -> 365 bytes testdata/lstream/boxes.lstr | Bin 0 -> 556 bytes testdata/lstream/boxes_au.oas | Bin 0 -> 399 bytes testdata/lstream/cells.lstr | Bin 0 -> 375 bytes testdata/lstream/cells_au.oas | Bin 0 -> 401 bytes testdata/lstream/cells_with_instances.lstr | Bin 0 -> 682 bytes testdata/lstream/cells_with_instances_au.oas | Bin 0 -> 417 bytes testdata/lstream/edge_pairs.lstr | Bin 0 -> 597 bytes testdata/lstream/edge_pairs_au.oas | Bin 0 -> 414 bytes testdata/lstream/edges.lstr | Bin 0 -> 556 bytes testdata/lstream/edges_au.oas | Bin 0 -> 407 bytes testdata/lstream/ghost_cells.lstr | Bin 0 -> 306 bytes testdata/lstream/ghost_cells_au.oas | Bin 0 -> 412 bytes testdata/lstream/meta_data.lstr | Bin 0 -> 487 bytes testdata/lstream/meta_data_au.oas | Bin 0 -> 496 bytes testdata/lstream/paths.lstr | Bin 0 -> 672 bytes testdata/lstream/paths_au.oas | Bin 0 -> 426 bytes testdata/lstream/pcells.lstr | Bin 0 -> 846 bytes testdata/lstream/pcells_au.oas | Bin 0 -> 366 bytes testdata/lstream/points.lstr | Bin 0 -> 544 bytes testdata/lstream/points_au.oas | Bin 0 -> 400 bytes testdata/lstream/polygons.lstr | Bin 0 -> 662 bytes testdata/lstream/polygons_au.oas | Bin 0 -> 437 bytes testdata/lstream/properties.lstr | Bin 0 -> 864 bytes testdata/lstream/properties_au.oas | Bin 0 -> 500 bytes testdata/lstream/simple_polygons.lstr | Bin 0 -> 592 bytes testdata/lstream/simple_polygons_au.oas | Bin 0 -> 404 bytes testdata/lstream/texts.lstr | Bin 0 -> 572 bytes testdata/lstream/texts_au.oas | Bin 0 -> 414 bytes testdata/lstream/variants.lstr | Bin 0 -> 488 bytes testdata/lstream/variants_au.oas | Bin 0 -> 481 bytes 38 files changed, 138 insertions(+), 91 deletions(-) create mode 100644 testdata/lstream/basic.lstr create mode 100644 testdata/lstream/basic_au.oas create mode 100644 testdata/lstream/boxes.lstr create mode 100644 testdata/lstream/boxes_au.oas create mode 100644 testdata/lstream/cells.lstr create mode 100644 testdata/lstream/cells_au.oas create mode 100644 testdata/lstream/cells_with_instances.lstr create mode 100644 testdata/lstream/cells_with_instances_au.oas create mode 100644 testdata/lstream/edge_pairs.lstr create mode 100644 testdata/lstream/edge_pairs_au.oas create mode 100644 testdata/lstream/edges.lstr create mode 100644 testdata/lstream/edges_au.oas create mode 100644 testdata/lstream/ghost_cells.lstr create mode 100644 testdata/lstream/ghost_cells_au.oas create mode 100644 testdata/lstream/meta_data.lstr create mode 100644 testdata/lstream/meta_data_au.oas create mode 100644 testdata/lstream/paths.lstr create mode 100644 testdata/lstream/paths_au.oas create mode 100644 testdata/lstream/pcells.lstr create mode 100644 testdata/lstream/pcells_au.oas create mode 100644 testdata/lstream/points.lstr create mode 100644 testdata/lstream/points_au.oas create mode 100644 testdata/lstream/polygons.lstr create mode 100644 testdata/lstream/polygons_au.oas create mode 100644 testdata/lstream/properties.lstr create mode 100644 testdata/lstream/properties_au.oas create mode 100644 testdata/lstream/simple_polygons.lstr create mode 100644 testdata/lstream/simple_polygons_au.oas create mode 100644 testdata/lstream/texts.lstr create mode 100644 testdata/lstream/texts_au.oas create mode 100644 testdata/lstream/variants.lstr create mode 100644 testdata/lstream/variants_au.oas diff --git a/src/plugins/streamers/lstream/db_plugin/lstrReader.cc b/src/plugins/streamers/lstream/db_plugin/lstrReader.cc index b4dd906da..c28e677e8 100644 --- a/src/plugins/streamers/lstream/db_plugin/lstrReader.cc +++ b/src/plugins/streamers/lstream/db_plugin/lstrReader.cc @@ -354,7 +354,7 @@ make_regular_array (stream::repetition::Repetition::Reader repetition, db::regul Reader::Reader (tl::InputStream &s) : m_stream (&s), m_source (s.source ()), m_progress (tl::to_string (tr ("Reading LStream file"))), - m_library_index (0), mp_layout (0), mp_cell (0), m_layout_view_id (0) + m_library_index (0), mp_cell (0), mp_layout (0), m_layout_view_id (0) { m_progress.set_format (tl::to_string (tr ("%.0f MB"))); m_progress.set_unit (1024 * 1024); @@ -423,6 +423,9 @@ Reader::do_read (db::Layout &layout) } catch (lstr::CoordinateOverflowException &ex) { // this adds source information error (ex.msg ()); + } catch (kj::Exception &ex) { + // this adds source information + error (ex.getDescription ().cStr ()); } } diff --git a/src/plugins/streamers/lstream/db_plugin/lstrWriter.cc b/src/plugins/streamers/lstream/db_plugin/lstrWriter.cc index 2c7c3da05..e4951130c 100644 --- a/src/plugins/streamers/lstream/db_plugin/lstrWriter.cc +++ b/src/plugins/streamers/lstream/db_plugin/lstrWriter.cc @@ -437,6 +437,21 @@ Writer::collect_property_ids (std::vector &prop_ids, std } } +namespace +{ + +struct ComparePropertyNameIdByValue +{ + bool operator() (db::property_names_id_type a, db::property_names_id_type b) const + { + const tl::Variant &na = db::property_name (a); + const tl::Variant &nb = db::property_name (b); + return na.less (nb); + } +}; + +} + /** * @brief Gets the LStream property set Id from a KLayout properties Id * @@ -463,8 +478,13 @@ Writer::make_property_id (db::properties_id_type id, std::vector ps_sorted; for (auto i = ps.begin (); i != ps.end (); ++i) { - make_property_name_id_from_id (i->first, prop_names); + ps_sorted.insert (i->first); + } + + for (auto i = ps_sorted.begin (); i != ps_sorted.end (); ++i) { + make_property_name_id_from_id (*i, prop_names); } return ls_id; @@ -684,7 +704,6 @@ Writer::make_layer_table (stream::library::LayerTable::Builder layers) for (auto l = m_layers_to_write.begin (); l != m_layers_to_write.end (); ++l) { - auto li = l->first; auto lp = l->second; // NOTE: currently, the purpose is always DRAWING @@ -876,11 +895,11 @@ Writer::write_cell (db::cell_index_type ci, kj::BufferedOutputStream &os) int view_index = 0; if (needs_layout_view) { tl_assert (m_layout_view_id >= 0); - cell.getViewIds ().set (view_index++, m_layout_view_id); + cell.getViewIds ().set (view_index++, (unsigned int) m_layout_view_id); } if (needs_meta_data_view) { tl_assert (m_meta_data_view_id >= 0); - cell.getViewIds ().set (view_index++, m_meta_data_view_id); + cell.getViewIds ().set (view_index++, (unsigned int) m_meta_data_view_id); } writePackedMessage (os, message); diff --git a/src/plugins/streamers/lstream/db_plugin/lstrWriter.h b/src/plugins/streamers/lstream/db_plugin/lstrWriter.h index 1236b3187..f771380c1 100644 --- a/src/plugins/streamers/lstream/db_plugin/lstrWriter.h +++ b/src/plugins/streamers/lstream/db_plugin/lstrWriter.h @@ -78,8 +78,8 @@ private: bool m_permissive; db::Layout *mp_layout; std::string m_cellname; - unsigned int m_layout_view_id; - unsigned int m_meta_data_view_id; + int m_layout_view_id; + int m_meta_data_view_id; std::map m_ls_lib_ids; std::vector > m_layers_to_write; std::set m_cells_to_write; diff --git a/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc b/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc index d0cac4c41..6515b7fa0 100644 --- a/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc +++ b/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc @@ -20,8 +20,7 @@ */ -#if 0 // @@@ -#include "dbMALYReader.h" +#include "lstrReader.h" #include "dbLayoutDiff.h" #include "dbWriter.h" #include "dbTestSupport.h" @@ -29,37 +28,16 @@ #include -static void run_test (tl::TestBase *_this, const std::string &base, const char *file, const char *file_au, const char *map = 0, double dbu = 0.001) +static void run_test (tl::TestBase *_this, const std::string &base, const char *file, const char *file_au) { - db::MALYReaderOptions *opt = new db::MALYReaderOptions(); - opt->dbu = dbu; - - db::LayerMap lm; - if (map) { - unsigned int ln = 0; - tl::Extractor ex (map); - while (! ex.at_end ()) { - std::string n; - int l; - ex.read_word_or_quoted (n); - ex.test (":"); - ex.read (l); - ex.test (","); - lm.map (n, ln++, db::LayerProperties (l, 0)); - } - opt->layer_map = lm; - opt->create_other_layers = true; - } - db::LoadLayoutOptions options; - options.set_options (opt); db::Manager m (false); db::Layout layout (&m); { std::string fn (base); - fn += "/maly/"; + fn += "/lstream/"; fn += file; tl::InputStream stream (fn); db::Reader reader (stream); @@ -67,82 +45,89 @@ static void run_test (tl::TestBase *_this, const std::string &base, const char * } std::string fn_au (base); - fn_au += "/maly/"; + fn_au += "/lstream/"; fn_au += file_au; db::compare_layouts (_this, layout, fn_au, db::WriteOAS); } -TEST(1_Basic) +TEST(basic) { - std::string fn (tl::testdata ()); - fn += "/maly/MALY_test1.maly"; - - tl::InputStream stream (fn); - db::MALYReader reader (stream); - - db::MALYData data = reader.read_maly_file (); - - EXPECT_EQ (data.to_string (), - "Mask A\n" - " Size 127000\n" - " Title \"\" m90 0,-50 1,1,1 [Standard]\n" - " Title \"MaskA1\" m90 50,50 1,1,1 [Standard]\n" - " Title \"WITH \"QUOTES\"\" r270 -50,0 1,1,1 [Standard]\n" - " Ref A1.oas{CHIP_A}(1) (0,0;10,10) m90 *1 20,0\n" - " Ref A2.oas{CHIP_A}(2) ename(e001) dname(d001) (0,0;50,50) m90 *0.8 20,0 [2x5,1x2]\n" - " Ref B3.oas{CHIP_A}(2) (0,0;12,12) m90 *1 20,0" - ) + run_test (_this, tl::testdata (), "basic.lstr", "basic_au.oas"); } -static std::string run_test_with_error (tl::TestBase * /*_this*/, const std::string &file) +TEST(boxes) { - std::string fn (tl::testdata ()); - fn += "/maly/"; - fn += file; - - tl::InputStream stream (fn); - db::MALYReader reader (stream); - - try { - reader.read_maly_file (); - tl_assert (false); - } catch (tl::Exception &ex) { - tl::error << ex.msg (); - return ex.msg (); - } + run_test (_this, tl::testdata (), "boxes.lstr", "boxes_au.oas"); } -TEST(2_Errors) +TEST(cells) { - EXPECT_EQ (run_test_with_error (_this, "MALY_test2a.maly").find ("Line break inside quoted string (line=17,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2b.maly").find ("/*...*/ comment not closed (line=43,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2c.maly").find ("Expected value STANDARD or NATIVE for FONT (line=7,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2d.maly").find ("Unknown base specification: NOVALIDBASE (line=8,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2e.maly").find ("Expected end of text here: NOVALIDKEY .. (line=15,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2f.maly").find ("Expected 'Y' or 'NONE' for MIRROR spec (line=15,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2g.maly").find ("Expected end of text here: UNEXPECTED (line=20,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2h.maly").find ("Expected value Y or NONE for MASKMIRROR (line=23,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2i.maly").find ("Expected end of text here: UNEXPECTED (line=29,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2j.maly").find ("Expected end of text here: NOVALIDKEY .. (line=30,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2k.maly").find ("Expected a real number here: SCALE 0.80 .. (line=31,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2l.maly").find ("Expected 'PARAMETER' here: CMASK (line=19,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2m.maly").find ("Expected 'CMASK' here: TITLE (line=18,"), size_t (0)); - EXPECT_EQ (run_test_with_error (_this, "MALY_test2n.maly").find ("Header expected ('BEGIN MALY') (line=2, "), size_t (0)); + run_test (_this, tl::testdata (), "cells.lstr", "cells_au.oas"); } -TEST(10_BasicLayout) +TEST(cells_with_instances) { - run_test (_this, tl::testdata (), "MALY_test10.maly", "maly_test10_au.oas"); - run_test (_this, tl::testdata (), "MALY_test10.maly", "maly_test10_lm_au.oas", "A: 10, B: 11, C: 12, D: 13"); - run_test (_this, tl::testdata (), "MALY_test10.maly", "maly_test10_dbu10nm_au.oas", 0, 0.01); + run_test (_this, tl::testdata (), "cells_with_instances.lstr", "cells_with_instances_au.oas"); } -TEST(11_Titles) +TEST(edge_pairs) { - run_test (_this, tl::testdata (), "MALY_test11.maly", "maly_test11_au.oas"); + run_test (_this, tl::testdata (), "edge_pairs.lstr", "edge_pairs_au.oas"); } -#endif -// @@@ +TEST(edges) +{ + run_test (_this, tl::testdata (), "edges.lstr", "edges_au.oas"); +} + +TEST(ghost_cells) +{ + run_test (_this, tl::testdata (), "ghost_cells.lstr", "ghost_cells_au.oas"); +} + +TEST(meta_data) +{ + run_test (_this, tl::testdata (), "meta_data.lstr", "meta_data_au.oas"); +} + +TEST(paths) +{ + run_test (_this, tl::testdata (), "paths.lstr", "paths_au.oas"); +} + +TEST(pcells) +{ + run_test (_this, tl::testdata (), "pcells.lstr", "pcells_au.oas"); +} + +TEST(points) +{ + run_test (_this, tl::testdata (), "points.lstr", "points_au.oas"); +} + +TEST(polygons) +{ + run_test (_this, tl::testdata (), "polygons.lstr", "polygons_au.oas"); +} + +TEST(properties) +{ + run_test (_this, tl::testdata (), "properties.lstr", "properties_au.oas"); +} + +TEST(simple_polygons) +{ + run_test (_this, tl::testdata (), "simple_polygons.lstr", "simple_polygons_au.oas"); +} + +TEST(texts) +{ + run_test (_this, tl::testdata (), "texts.lstr", "texts_au.oas"); +} + +TEST(variants) +{ + run_test (_this, tl::testdata (), "variants.lstr", "variants_au.oas"); +} diff --git a/src/plugins/streamers/lstream/unit_tests/unit_tests.pro b/src/plugins/streamers/lstream/unit_tests/unit_tests.pro index 3d993288f..8e83c6e61 100644 --- a/src/plugins/streamers/lstream/unit_tests/unit_tests.pro +++ b/src/plugins/streamers/lstream/unit_tests/unit_tests.pro @@ -9,7 +9,7 @@ include($$PWD/../../../../lib_ut.pri) SOURCES = \ dbLStreamReaderTests.cc -INCLUDEPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common +INCLUDEPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common $$PWD/../db_plugin/capnp DEPENDPATH += $$LAY_INC $$TL_INC $$DB_INC $$GSI_INC $$PWD/../db_plugin $$PWD/../../../common LIBS += -L$$DESTDIR_UT -lklayout_db -lklayout_tl -lklayout_gsi diff --git a/src/plugins/streamers/oasis/db_plugin/dbOASISWriter.cc b/src/plugins/streamers/oasis/db_plugin/dbOASISWriter.cc index 292326925..5ed3f5ed5 100644 --- a/src/plugins/streamers/oasis/db_plugin/dbOASISWriter.cc +++ b/src/plugins/streamers/oasis/db_plugin/dbOASISWriter.cc @@ -3309,6 +3309,46 @@ OASISWriter::write_shapes (const db::LayerProperties &lprops, const db::Shapes & break; + case db::Shape::EdgePair: + + if (shape->has_prop_id ()) { + db::EdgePairWithProperties edge_pair = *shape->basic_ptr (db::EdgePairWithProperties::tag ()); + db::EdgeWithProperties e1 (edge_pair.first (), edge_pair.properties_id ()); + db::EdgeWithProperties e2 (edge_pair.second (), edge_pair.properties_id ()); + db::Disp tr; + e1.reduce (tr); + edge_with_properties_compressor.add (e1, tr.disp ()); + e2.reduce (tr); + edge_with_properties_compressor.add (e2, tr.disp ()); + } else { + db::EdgePair edge_pair = *shape->basic_ptr (db::EdgePair::tag ()); + db::Disp tr; + edge_pair.first ().reduce (tr); + edge_compressor.add (edge_pair.first (), tr.disp ()); + edge_pair.second ().reduce (tr); + edge_compressor.add (edge_pair.second (), tr.disp ()); + } + + break; + + case db::Shape::Point: + + if (shape->has_prop_id ()) { + db::PointWithProperties point = *shape->basic_ptr (db::PointWithProperties::tag ()); + db::EdgeWithProperties e (db::Edge (point, point), point.properties_id ()); + db::Disp tr; + e.reduce (tr); + edge_with_properties_compressor.add (e, tr.disp ()); + } else { + db::Point point = *shape->basic_ptr (db::Point::tag ()); + db::Disp tr; + db::Edge e (point, point); + e.reduce (tr); + edge_compressor.add (e, tr.disp ()); + } + + break; + case db::Shape::Path: if (shape->has_prop_id ()) { diff --git a/testdata/lstream/basic.lstr b/testdata/lstream/basic.lstr new file mode 100644 index 0000000000000000000000000000000000000000..43f18d60d00c92f703d00fdad5929f152e3b0dbe GIT binary patch literal 182 zcmeYXE-6Y)%#AnHGhh(lbzos&5ag^9IMsOE5ahFgdC)I%+;R4CduxWH!_@V9;Qc5oh9Hk>O`nVo3GLJ!8$)U?9MHpvdt8bH{YS z&7F;ZPDBT;F8?3RaVv_yr{}>k&5c$3rZW#bIB+fda^Chc332*LZHxLg&R~0Mvv_mt dwDWzRRx@X8-TRZ7iID*aWx*sv!$<=R3;?oCqx1j( literal 0 HcmV?d00001 diff --git a/testdata/lstream/boxes.lstr b/testdata/lstream/boxes.lstr new file mode 100644 index 0000000000000000000000000000000000000000..0a6431f01faf134d91d31ca92f73ed426c4d6670 GIT binary patch literal 556 zcmchU!Ab)`42JXXW}WWp;zld0P*6cZL~6AMp_k6ki$Vp9pyEXe?LkxoX|W1EgC2Z< z`W`-v2j8P+x7Cwgg$zuR|NoLFDaZ{czjwtx&yE zu2#ysM2H()+Je>>;YyxcgWJesfYvJ@Fcu1gIhrJbDZyTgJ^rxIR$FmR z;`7Wsg9&id%!i&_lHa}02)=LLyxHJ>I* z`j#6n@FYB)e}icZ!72*XznZ!;ZY1EwmY#jE`(!s{_s*`AX@H!O3VZ0FBe4-N5*oc& z=zGQ?@vIygSx@D_IEM99E``hyVF|^Y^HU|#Y7xb6>mS7bFXubw+dW~B{nhV}{Q|`4 BLVN%K literal 0 HcmV?d00001 diff --git a/testdata/lstream/boxes_au.oas b/testdata/lstream/boxes_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..0c54e6c2ec8437c89386487364c05a2fa8192f03 GIT binary patch literal 399 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqf|io6Skh>H()eRliJ!{h4x`E@g*SyfJ|a!eGB;;hfv zlxWt0{ygNeKR`TG@fh*6%{$az0K*1|Anam0FnWxO+9>lKK7&AR%I+qycd-?0=B?@V zJ?ZsZQqV15F_v|%G=YZ$((DEVL|j6ElR8K8DY9gfc^#ze5c$1eqE}p4KC*FS7AROA b$Q2}-pQa1^HR(uanQbCCIb9ZA{=eccohMDc literal 0 HcmV?d00001 diff --git a/testdata/lstream/cells_au.oas b/testdata/lstream/cells_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..c37822b6d96a9cccd442cae1a2f049811ef1d039 GIT binary patch literal 401 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&mben(Z>XUoMnybM; zfb~F;;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqfX^bla=LP9%s#WD|lQ5+Od$?ye4gf*<7Q z=m)s3njK#kS2LAKRrRY^?@h07TwWZs&i3YNb;?rDM3US|T9I_HeRA5mJ-@mfqt$wC zp|6q>ruKa z=}s}-gHOWtdS~h8G1-Ibg24(#bB0lLG$2U@AZ6alV`DWL=_4y?9{~Yt#g=LwD?(kQ zT163%S+DJGqHNJ~$c!XT#;c*pO(ddzV$*(Vmk+)YI|KU|7fet9!-fpl*Vk%|K^-Hq zZ@Sn?%Slp|U3J=lmtT{Q=_r~OaD>dLyrLkZX)&n(L*qx;q36c7QYTye$8e1!usTlE z#kdP9`h~+gH!^T|=5WN}o&&3V6#GT@J57ASScas%GV5g0$+Qa$Z%UggLM{A4{W1Li M?anQH%lpIC2Sn{$mjD0& literal 0 HcmV?d00001 diff --git a/testdata/lstream/cells_with_instances_au.oas b/testdata/lstream/cells_with_instances_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..7e9da646c7d869763606b3a035cb66bc8e418fbe GIT binary patch literal 417 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqf&_j22=eXdyO! zn4b{8B+lIh3$ckX1N(N~zBe=5J{sK&dROOrwK^3etBE*x;3(uMo?Z@n_t&?hO={I^ zje2dL$Z5rX$bOTkl^2T*Taf!QTt&Gm+;$dYbUy%wu@FI+&I~XX7zbUg^u)efDMd|= z&eGRQm|a8%vzz3K1YVxaA4$M zAp_+x@AWdj89t2p)i@2SWTCFC#DWW{ONe!pW@wP3tdn0%BB_;rn8?xp8k%dWtk2B- L5##hz|6a;BcS=R~ literal 0 HcmV?d00001 diff --git a/testdata/lstream/edge_pairs_au.oas b/testdata/lstream/edge_pairs_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..052eed6f0127af47d002910cdb1d7b097d76e347 GIT binary patch literal 414 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqf*97zM;kSQt|^PB3yY g2rx4`%7`;?lrb?*V`OAtRAwv&k_-(a3@|VN0FPj-O8@`> literal 0 HcmV?d00001 diff --git a/testdata/lstream/edges.lstr b/testdata/lstream/edges.lstr new file mode 100644 index 0000000000000000000000000000000000000000..c097e8c0d58b9392b628de1fc9cdf6768945467b GIT binary patch literal 556 zcmb7>!Ab)`42JXXW}WWp;zld0P*6cZL~6AMp_k6ki$Vp9pyEXe?LkxoX|W1EgC2YU zeGebTgYQwZ+u}))LIx(upYP8w&Ewu(w|#T5Q?5`FTPBk5QQ}DAba-{$ez@)TR;XSn zS1aXRBFCNtkpwlO`ly*yZ9(gca3#;J!ENL*Ku z@p(2qgE4T}%uP=&$?x801YfY+VtA?!79@-myO}|^72^{moFl+x2C2$&zaa6g=F>z; z-*V#xo`k3K?=X!wu!=&RUrpT^Hxh7TOV2*oeX;AX`(RhfG(gTsg*|l8k=TeB35{MX z^gW~avpg$@M%Gg~Fpgn8rAQ$IMOZ>H$NyA`v|2>*AL3;G6RGp%@-?0?$o}g0$9@Bf C0YX3k literal 0 HcmV?d00001 diff --git a/testdata/lstream/edges_au.oas b/testdata/lstream/edges_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..86d84376541bec0349663137141b3f3bea474716 GIT binary patch literal 407 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqfY5S_QX=iWsZb^?+V3K0aYj?*AQn(U@YihwyH3N|rC3Q-XxBHH*9Z2W=# z5-+=VaTu77$9r#PI$yu8md}f`ydZ0wBI4|mO^Z#ZdVE@byu7V@G%WIdk)IQJB{*qu zG9Vf@puKQu*mvO%gg=Hqt@9q`55Uk4K@fVj9T+=|%TfvT>%Lup%z({ZWba`sSWRow zn+KAs_oyIizF^#zsgMLdY?EX&BEWx*7URj){2Bp1DN{tZEQw}`l`fQBBD?RDw}Lax kN80z)3>k+vQh^ZFU)2Qun|P|x%sLWGcpxmAv?40X4g1+UF#rGn literal 0 HcmV?d00001 diff --git a/testdata/lstream/ghost_cells_au.oas b/testdata/lstream/ghost_cells_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..5aaf0fcbe72991e0097f0458921b5ebed1382274 GIT binary patch literal 412 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&mben(Z>XUoMnybM; zfb~F;;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqfD{62IC~LAP%#buQ%`io56Xqh{D-Lr_~0}l{x^~FXTGpmebp5_&i@GHR!in-FC|d zP`V()A)^P-FPh$ow76bDwI$RJs@>c_F!(|wG$ryvG>5+l;Tqv}U^5t#h^t`gh$HKsN_@WGN=fox=(c{s0rMjMM>C6ucC*^BEC<+ zjOTaA0|0r4RilxK==C4N=`!-uZ2mY*LI6n5R`L2M&OTwKg77fVg~od94M0?x_Hv+O zj$(M4{uOxNl39?P9o2sS{(I!5RC6F!sP7A|Tke$FaiOlSQ%ZK4Y;a*i@wzB{n rQ}r#wqP;OSo!~%VI*F#!CaVUGIrD^JF{fo#<`cNjEPuxSLwA1wzx8X< literal 0 HcmV?d00001 diff --git a/testdata/lstream/meta_data_au.oas b/testdata/lstream/meta_data_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..a95608e318d90ff6a2d100fff3a6337c8ff19655 GIT binary patch literal 496 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&mg15%FoEpq{L7bo_ofS ztHFTB?V+KEi(};{q??{+co_8`;RL^edY+I%$wS4<@%v3XlcRLZnmS( z{4#iE+9sLt#T2^abN9}F`!ig+)wA;XmGviMH%Y5i&bpkZ#L&PP{5YlL$&`*Z3iB05wHXqHUW-?n2DMA3tl?weWsv#C%EZUa$HL6$C?n3mahH*a@i`+S1EUsW ND~Muf7+HXU0RVvi(S-m2 literal 0 HcmV?d00001 diff --git a/testdata/lstream/paths.lstr b/testdata/lstream/paths.lstr new file mode 100644 index 0000000000000000000000000000000000000000..99e9acf47d5777aaedb66b9cb38e81c3d4fb8849 GIT binary patch literal 672 zcmd6ky-EW?5XbkwJLld-4{nU2g`k4s2N+{gC~4d!mMJ_06&n#06cs@te!PSh78dq4 zK7tQmnbOkI2e1^*xg=m?z|v&~c0Tqu!+#qa&GUo3)7_;~StYR}r8v6bxWMs9c6_pT zeRk2DP^;xqwOpzwZu6F}QA7eQs zP4Dj3Nhz*zypz8kKo^)b+Cw*wlsUM}35GGA60~#&!yFX^JD)=r1!ELA8dQMK2aHHt zdtQ(jCvm@0$&;h{w$>bN6_2#7A8L}ONZwCc@5sN9eBx$3-)uR;bN~sAgIg`%3pJ k0DmZ1fruqqNC19i{YWPZggRTvItP#4i}?!8L)csLZ}bIYKmY&$ literal 0 HcmV?d00001 diff --git a/testdata/lstream/paths_au.oas b/testdata/lstream/paths_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..fbf62fc9c58b7d0f6782d07ed2fc33d07c2f517e GIT binary patch literal 426 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqfkC7zyJW$udvGi literal 0 HcmV?d00001 diff --git a/testdata/lstream/pcells.lstr b/testdata/lstream/pcells.lstr new file mode 100644 index 0000000000000000000000000000000000000000..55075c9a35b41f0afdd6a00984e78babfc5490ef GIT binary patch literal 846 zcmc&y&59F25bo-(NoS(Nrf_BVHY@CL%_dP$1|i)U1%(KXiv|=~hD~6@#;ndJih@7* z0*uTQ>+asxG#jROw_A;-s0RjxApbE1 zH40Ypy>a?ze>Pncoo3@qv(Xm9q9m_IUL-`POx7QmD#usBu1otC?7PB_VCyvi5G+|_ z-wwO!!DxrEp`R=R2$8Hw=Qj#}w(u7Ue^CN>t}x5fo#`wcZ)YM*2cy|R8IC%;>0~e- zmb-SyEQVRR={}p>+aFD)KP$7Mk3bvdP$4*%pu{icrD6OaqTrUJeH`XW@?N3#=18dF zL)WAT!UREbwRe*I8uMnHO$Jd;0{Ib}twJZhay{-{n*aWg2#~C^Aepd4P>BOD z2*4*t@P2X55!@aW0;2GAYomFmOuzXpU5JfZdXtk9DvVI#Fs&74>PUfCS5EFRA?o)H z#?L{L-#_sRbbQFO5qvH>rL95x0qtju&jZ>+v^})DXc4dRtp%D$ldpMUfCHudm+%tZ z&~#N(qWK{iFp~HM`h6ktC*Sho6SOSz)uZ`Fb@{r~3shefFWKiGzt2#skHzA literal 0 HcmV?d00001 diff --git a/testdata/lstream/pcells_au.oas b/testdata/lstream/pcells_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..88943799d812b233eab24fa7b84a1005ad322b89 GIT binary patch literal 366 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)Yti+J&lY7RRtHD5k^+1v11?GpTwVS@n&Va!e^1YYWttnS_)TXXcyQoa_T{|oXA`oEIn*R_ld%U^QPQ$|sh~ z35+BcjWQ*48K_n7R?(v9NCWE&|E{b*8S9&>QMLE?#=qkZPksOZ literal 0 HcmV?d00001 diff --git a/testdata/lstream/points_au.oas b/testdata/lstream/points_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..97b971d2711b9bfdd17a88f6a6a2de996cc7e0df GIT binary patch literal 400 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqfl7^5iyX|l^Z*hs)Y#E2jff2urzT3A^4 z02T`RCKf(`r4Jxjp0k&vQX9c#irJa@zHjGa>l@wUR`YOorC5R}Gzx%%3kq`-#_2() zd46=#oq<}ZSS}S;0jv__<;bf7)cVb+Y<#Xyp)CkIhjt;0Gi=--5^94?h4rkV)7~TnIi_87q{~br0Vx;;nAc3at3m0Y7r9#GkPW%rcrDO+$Oh#5sp zEb^k=OEr(^^cA+A1`{xxb|OMHEzIM{`h~ZIQRWd{TgE`!mfB z7?Eu-gt#RblHT>(DGrlg;7-RO=Gk3e$ai*`J^0hYOyi61!m^i_?a2L#pKbjDA`5&1 literal 0 HcmV?d00001 diff --git a/testdata/lstream/polygons_au.oas b/testdata/lstream/polygons_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..14b5519b2247abc596957f755d4dc3cad6d7ea0c GIT binary patch literal 437 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqf!K~Fexb#!VriW z*yP=qJa@@!d7`(PlLAL`5PbnD@V>$pI1yY4>a4cs?z5xfY+bUKp`JGC5@(yG4KMbU z86Ss=42AJ7P1Vt&q%D@o+XXwrL>rc)L+Ce2KSKdbsxV5KU%<$GP3tumCBdavU!v$g zZkNR=n1_iuU8tTwZYgsFLsu^>>NFPB&x8&H!x#(@E99EvUso2Lr9Hu0wxLV6YX<^g R_GeaoXeQ*DyJ@}|e*wttanb+) literal 0 HcmV?d00001 diff --git a/testdata/lstream/properties_au.oas b/testdata/lstream/properties_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..4e070b4ede8c25a3134fa8c1e3620e9a84c1ba38 GIT binary patch literal 500 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&mg1D$RWtjC?m$op{2x7 z7@7Q>x39eH>&MRT<;C1(yot}b`^w8X`}jFN@fYxNb*4<`>ib^W)4~6(x=l3t% zg{9@ZUHsomI6o##Z#>cZD{<;mu0H;c{0!3P&cy`HJAW=}Qs9(XTnwCyj-1T-d8wR? zrJRfvoQ##cjJym=4Bobr1(P4A3)!4MapJ^;NlMy5IxD6YH5E4Q>0oH?u~KeVuwUFG zq1`^M@i!VuV(Jq5ADl%EPc!%?GBPkTI?9MMaLi|9W^@8E<}xxdK4N5KVAN;q N0Z|MMBMUGv0060#$UXo7 literal 0 HcmV?d00001 diff --git a/testdata/lstream/simple_polygons.lstr b/testdata/lstream/simple_polygons.lstr new file mode 100644 index 0000000000000000000000000000000000000000..ffe2dc3442a58a17b91c59cba8d652f91a2968f2 GIT binary patch literal 592 zcmc(cy-EW?5P)ZP=e)a^gBwN8LQo-~Sj1?GK$`4wSO_T$f`W~v2t?=I%dpJvH?yBvONzY`drg2=5sd355dS>d1!XH}S97_>&IpmwHz+{#cP0ko6l0@9ir&qG zkx6LM7SW9ET;rt~uzsU^F0yGk|DagGAEueqOAN z*wX;<74=5K$ zKC{oEQw++B3i&7ZwoH=nmQ0dQiw2Ei`JJ$lJ!QqgZ-vXUJpCBxF#%@%k0K0z&o8V% Q{bcF8vhK(3KYw4x7fVrXz5oCK literal 0 HcmV?d00001 diff --git a/testdata/lstream/simple_polygons_au.oas b/testdata/lstream/simple_polygons_au.oas new file mode 100644 index 0000000000000000000000000000000000000000..bbfed5c8660ef96a81210c9d49b918b5741254a0 GIT binary patch literal 404 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqf{LW^|MhXW%Gf WV(ejLWMEWgEC!Mc4I>ONFaQ82Ypcuv literal 0 HcmV?d00001 diff --git a/testdata/lstream/texts.lstr b/testdata/lstream/texts.lstr new file mode 100644 index 0000000000000000000000000000000000000000..4354713b3e3fa10aee84fa7f3978dea1ea6afc25 GIT binary patch literal 572 zcmb`Eu}T9$5Qb;==Gffn;f+QwMIZ_mY7vttMABrJ!!AV*qXruZm_k$pi3F`I?d-${ zu!y}6;bZtFarTUzWngyMnf>?wX4uZr=x#W;Ij>i15J!dpIC$hJy< zu2uJH)dqki#eT?s3!wdb88=Nq>Ls*gWjE1op*=wRjM+OPqc$jpsJpX-agF_kM5TAw z@743Y!Pv}5(YJXqB92-dojJcnoFS&2yp5Af@P=dO=`mI^LM3W{m4i?~I}WoeHXa}c z%YbMdG7(wcfggKD@&$l+Y$$z0#lh*y2kLZ!B%(mxZzQ%)X$dLam(@kG6S5a%pU9S- z1~K+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EJR>XUoMnybM;fb~F; z;|1o9>4KX(8~>b$4qRRSKbqrK6n{_8gJqfgk772|Fq^YHzJ$Mk* zck$pu_y8V#lRCR;N)Pifv-8i+?CfxyrIXc4@r*W`K7Fm-G zoKDZ_xQzKaa-+hHK4XJCX@7cUIr8Me<3#;VZ4t3983@BQdo)xkRu$FJX7=( zFBC_LSBke(XviY>C`i*_l?Uxwm?UxT_XqdMB8(?_)H0)4R*2$gzVTb;EZXYlSsKkA zIMjTdhT541K)g^t6t6^0yb*QrAtw-D#FF?XnsS)(9g&Nz`N?ir^oj+(+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;Fs&mbel#?L4t#?B!qBgVm@ zC8Ng4A;`}p!^R~e#?8;H#4w4mGWj`gUwPTrkDcGki@D2q6Q6VUm6vn&@pF9QFW}|s zOqtHr_r0{Iga2E}_u|sd?_anJOUrq?_`jEMeoUC&c%t=J;?$>Hef%H!8Klphn-vi< zCF10{NmJ&}KYVW5r1)7=CZ9StXJ+`JbCV`V#vD2~XF8{dzMkf(Gv4eBoC4L^hPHNw t<~rF%wsxgu<+YqFB}JvFoXkKrCv##_G7}>M5IQpMX9O`CMi^jV008*o#)$v` literal 0 HcmV?d00001