Skip to content

Commit 6ae3737

Browse files
Merge pull request #2065 from KLayout/feature/issue-2041
Feature/issue 2041
2 parents d10683e + ad444c5 commit 6ae3737

27 files changed

+1082
-179
lines changed

src/buddies/src/bd/bdReaderOptions.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,12 +846,20 @@ static std::vector<std::string> split_file_list (const std::string &infile)
846846

847847
void read_files (db::Layout &layout, const std::string &infile, const db::LoadLayoutOptions &options)
848848
{
849+
// We may do this:
850+
// db::LayoutLocker locker (&layout);
851+
// but there are yet unknown side effects
852+
853+
// enter a LEF caching context for chaining multiple DEF with the same LEF
854+
db::LoadLayoutOptions local_options (options);
855+
local_options.set_option_by_name ("lefdef_config.lef_context_enabled", true);
856+
849857
std::vector<std::string> files = split_file_list (infile);
850858

851859
for (std::vector<std::string>::const_iterator f = files.begin (); f != files.end (); ++f) {
852860
tl::InputStream stream (*f);
853861
db::Reader reader (stream);
854-
reader.read (layout, options);
862+
reader.read (layout, local_options);
855863
}
856864
}
857865

src/buddies/unit_tests/bdConverterTests.cc

Lines changed: 324 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,327 @@ TEST(6)
186186

187187
db::compare_layouts (this, layout, input_au, db::WriteGDS2);
188188
}
189+
190+
// Large LEF/DEF to OAS converter test
191+
TEST(10)
192+
{
193+
test_is_long_runner ();
194+
195+
std::string input_dir = tl::testdata_private ();
196+
input_dir += "/lefdef/strm2oas/";
197+
198+
std::string lef_dir = input_dir + "/lef";
199+
std::string def_dir = input_dir + "/def";
200+
std::string gds_dir = input_dir + "/gds";
201+
202+
std::string input_au = input_dir + "/strm2oas_au.oas";
203+
204+
std::string output = this->tmp_file ("strm2oas.oas");
205+
std::string map_arg = "--lefdef-map=" + input_dir + "/sky130.map";
206+
207+
const char *lef_files[] = {
208+
"sky130_fd_sc_hd.tlef",
209+
"sky130_fd_sc_hd_merged.lef",
210+
"sky130_fd_sc_hs_merged.lef",
211+
"sky130_ef_sc_hd__decap_20_12.lef",
212+
"sky130_ef_sc_hd__decap_80_12.lef",
213+
"sky130_ef_sc_hd__fill_4.lef",
214+
"sky130_ef_sc_hd__decap_40_12.lef",
215+
"sky130_ef_sc_hd__decap_60_12.lef",
216+
"sky130_ef_io__analog_esd_pad.lef",
217+
"sky130_ef_io__analog_noesd_pad.lef",
218+
"sky130_ef_io__analog_pad.lef",
219+
"sky130_ef_io__bare_pad.lef",
220+
"sky130_ef_io__com_bus_slice_10um.lef",
221+
"sky130_ef_io__com_bus_slice_1um.lef",
222+
"sky130_ef_io__com_bus_slice_20um.lef",
223+
"sky130_ef_io__com_bus_slice_5um.lef",
224+
"sky130_ef_io__connect_vcchib_vccd_and_vswitch_vddio_slice_20um.lef",
225+
"sky130_ef_io__corner_pad.lef",
226+
"sky130_ef_io__disconnect_vccd_slice_5um.lef",
227+
"sky130_ef_io__disconnect_vdda_slice_5um.lef",
228+
"sky130_ef_io__gpiov2_pad.lef",
229+
"sky130_ef_io__gpiov2_pad_wrapped.lef",
230+
"sky130_ef_io__top_power_hvc.lef",
231+
"sky130_ef_io__vccd_hvc_pad.lef",
232+
"sky130_ef_io__vccd_lvc_clamped2_pad.lef",
233+
"sky130_ef_io__vccd_lvc_clamped3_pad.lef",
234+
"sky130_ef_io__vccd_lvc_clamped_pad.lef",
235+
"sky130_ef_io__vccd_lvc_pad.lef",
236+
"sky130_ef_io__vdda_hvc_clamped_pad.lef",
237+
"sky130_ef_io__vdda_hvc_pad.lef",
238+
"sky130_ef_io__vdda_lvc_pad.lef",
239+
"sky130_ef_io__vddio_hvc_clamped_pad.lef",
240+
"sky130_ef_io__vddio_hvc_pad.lef",
241+
"sky130_ef_io__vddio_lvc_pad.lef",
242+
"sky130_ef_io__vssa_hvc_clamped_pad.lef",
243+
"sky130_ef_io__vssa_hvc_pad.lef",
244+
"sky130_ef_io__vssa_lvc_pad.lef",
245+
"sky130_ef_io__vssd_hvc_pad.lef",
246+
"sky130_ef_io__vssd_lvc_clamped2_pad.lef",
247+
"sky130_ef_io__vssd_lvc_clamped3_pad.lef",
248+
"sky130_ef_io__vssd_lvc_clamped_pad.lef",
249+
"sky130_ef_io__vssd_lvc_pad.lef",
250+
"sky130_ef_io__vssio_hvc_clamped_pad.lef",
251+
"sky130_ef_io__vssio_hvc_pad.lef",
252+
"sky130_ef_io__vssio_lvc_pad.lef",
253+
"sky130_fd_io__signal_5_sym_hv_local_5term.lef",
254+
"sky130_fd_io__top_gpiov2.lef",
255+
"sky130_fd_io__top_power_hvc_wpadv2.lef",
256+
"sky130_fd_sc_hvl__a21o_1.lef",
257+
"sky130_fd_sc_hvl__a21oi_1.lef",
258+
"sky130_fd_sc_hvl__a22o_1.lef",
259+
"sky130_fd_sc_hvl__a22oi_1.lef",
260+
"sky130_fd_sc_hvl__and2_1.lef",
261+
"sky130_fd_sc_hvl__and3_1.lef",
262+
"sky130_fd_sc_hvl__buf_1.lef",
263+
"sky130_fd_sc_hvl__buf_16.lef",
264+
"sky130_fd_sc_hvl__buf_2.lef",
265+
"sky130_fd_sc_hvl__buf_32.lef",
266+
"sky130_fd_sc_hvl__buf_4.lef",
267+
"sky130_fd_sc_hvl__buf_8.lef",
268+
"sky130_fd_sc_hvl__conb_1.lef",
269+
"sky130_fd_sc_hvl__decap_4.lef",
270+
"sky130_fd_sc_hvl__decap_8.lef",
271+
"sky130_fd_sc_hvl__dfrbp_1.lef",
272+
"sky130_fd_sc_hvl__dfrtp_1.lef",
273+
"sky130_fd_sc_hvl__dfsbp_1.lef",
274+
"sky130_fd_sc_hvl__dfstp_1.lef",
275+
"sky130_fd_sc_hvl__dfxbp_1.lef",
276+
"sky130_fd_sc_hvl__dfxtp_1.lef",
277+
"sky130_fd_sc_hvl__diode_2.lef",
278+
"sky130_fd_sc_hvl__dlclkp_1.lef",
279+
"sky130_fd_sc_hvl__dlrtp_1.lef",
280+
"sky130_fd_sc_hvl__dlxtp_1.lef",
281+
"sky130_fd_sc_hvl__einvn_1.lef",
282+
"sky130_fd_sc_hvl__einvp_1.lef",
283+
"sky130_fd_sc_hvl__fill_1.lef",
284+
"sky130_fd_sc_hvl__fill_2.lef",
285+
"sky130_fd_sc_hvl__fill_4.lef",
286+
"sky130_fd_sc_hvl__fill_8.lef",
287+
"sky130_fd_sc_hvl__inv_1.lef",
288+
"sky130_fd_sc_hvl__inv_16.lef",
289+
"sky130_fd_sc_hvl__inv_2.lef",
290+
"sky130_fd_sc_hvl__inv_4.lef",
291+
"sky130_fd_sc_hvl__inv_8.lef",
292+
"sky130_fd_sc_hvl__lsbufhv2hv_hl_1.lef",
293+
"sky130_fd_sc_hvl__lsbufhv2hv_lh_1.lef",
294+
"sky130_fd_sc_hvl__lsbufhv2lv_1.lef",
295+
"sky130_fd_sc_hvl__lsbufhv2lv_simple_1.lef",
296+
"sky130_fd_sc_hvl__lsbuflv2hv_1.lef",
297+
"sky130_fd_sc_hvl__lsbuflv2hv_clkiso_hlkg_3.lef",
298+
"sky130_fd_sc_hvl__lsbuflv2hv_isosrchvaon_1.lef",
299+
"sky130_fd_sc_hvl__lsbuflv2hv_symmetric_1.lef",
300+
"sky130_fd_sc_hvl__mux2_1.lef",
301+
"sky130_fd_sc_hvl__mux4_1.lef",
302+
"sky130_fd_sc_hvl__nand2_1.lef",
303+
"sky130_fd_sc_hvl__nand3_1.lef",
304+
"sky130_fd_sc_hvl__nor2_1.lef",
305+
"sky130_fd_sc_hvl__nor3_1.lef",
306+
"sky130_fd_sc_hvl__o21a_1.lef",
307+
"sky130_fd_sc_hvl__o21ai_1.lef",
308+
"sky130_fd_sc_hvl__o22a_1.lef",
309+
"sky130_fd_sc_hvl__o22ai_1.lef",
310+
"sky130_fd_sc_hvl__or2_1.lef",
311+
"sky130_fd_sc_hvl__or3_1.lef",
312+
"sky130_fd_sc_hvl__probe_p_8.lef",
313+
"sky130_fd_sc_hvl__probec_p_8.lef",
314+
"sky130_fd_sc_hvl__schmittbuf_1.lef",
315+
"sky130_fd_sc_hvl__sdfrbp_1.lef",
316+
"sky130_fd_sc_hvl__sdfrtp_1.lef",
317+
"sky130_fd_sc_hvl__sdfsbp_1.lef",
318+
"sky130_fd_sc_hvl__sdfstp_1.lef",
319+
"sky130_fd_sc_hvl__sdfxbp_1.lef",
320+
"sky130_fd_sc_hvl__sdfxtp_1.lef",
321+
"sky130_fd_sc_hvl__sdlclkp_1.lef",
322+
"sky130_fd_sc_hvl__sdlxtp_1.lef",
323+
"sky130_fd_sc_hvl__xnor2_1.lef",
324+
"sky130_fd_sc_hvl__xor2_1.lef",
325+
"caravel.lef",
326+
"caravel_clocking.lef",
327+
"caravel_core.lef",
328+
"gpio_defaults_block.lef",
329+
"gpio_logic_high.lef",
330+
"housekeeping.lef",
331+
"mgmt_protect_hv.lef",
332+
"mprj2_logic_high.lef",
333+
"mprj_io_buffer.lef",
334+
"mprj_logic_high.lef",
335+
"spare_logic_block.lef",
336+
"user_project_wrapper.lef",
337+
"xres_buf.lef",
338+
"caravel_logo-stub.lef",
339+
"caravel_motto-stub.lef",
340+
"chip_io.lef",
341+
"copyright_block-stub.lef",
342+
"empty_macro.lef",
343+
"manual_power_connections.lef",
344+
"open_source-stub.lef",
345+
"simple_por.lef",
346+
"user_id_programming.lef",
347+
"user_id_textblock-stub.lef",
348+
"RAM128.lef"
349+
};
350+
351+
std::string lefs_arg = "--lefdef-lefs=";
352+
for (size_t i = 0; i < sizeof (lef_files) / sizeof (lef_files[0]); ++i) {
353+
if (i > 0) {
354+
lefs_arg += ",";
355+
}
356+
lefs_arg += lef_dir + "/" + lef_files[i];
357+
}
358+
359+
const char *lefdef_layout_files[] = {
360+
"sky130_fd_sc_hd.gds",
361+
"sky130_fd_sc_hvl__sdlxtp_1.gds",
362+
"sky130_fd_sc_hvl__decap_8.gds",
363+
"sky130_fd_sc_hvl__decap_4.gds",
364+
"sky130_fd_sc_hvl__nand3_1.gds",
365+
"sky130_fd_sc_hvl__sdfxbp_1.gds",
366+
"sky130_fd_sc_hvl__lsbufhv2hv_hl_1.gds",
367+
"sky130_fd_sc_hvl__sdfrbp_1.gds",
368+
"sky130_fd_sc_hvl__a21o_1.gds",
369+
"sky130_fd_sc_hvl__inv_2.gds",
370+
"sky130_fd_sc_hvl__inv_16.gds",
371+
"sky130_fd_sc_hvl__inv_1.gds",
372+
"sky130_fd_sc_hvl__inv_4.gds",
373+
"sky130_fd_sc_hvl__inv_8.gds",
374+
"sky130_fd_sc_hvl__nand2_1.gds",
375+
"sky130_fd_sc_hvl__dfstp_1.gds",
376+
"sky130_fd_sc_hvl__a22o_1.gds",
377+
"sky130_fd_sc_hvl__schmittbuf_1.gds",
378+
"sky130_fd_sc_hvl__a22oi_1.gds",
379+
"sky130_fd_sc_hvl__lsbuflv2hv_1.gds",
380+
"sky130_fd_sc_hvl__fill_4.gds",
381+
"sky130_fd_sc_hvl__fill_1.gds",
382+
"sky130_fd_sc_hvl__fill_2.gds",
383+
"sky130_fd_sc_hvl__fill_8.gds",
384+
"sky130_fd_sc_hvl__sdfrtp_1.gds",
385+
"sky130_fd_sc_hvl__sdfxtp_1.gds",
386+
"sky130_fd_sc_hvl__o22a_1.gds",
387+
"sky130_fd_sc_hvl__dfsbp_1.gds",
388+
"sky130_fd_sc_hvl__o21a_1.gds",
389+
"sky130_fd_sc_hvl__a21oi_1.gds",
390+
"sky130_fd_sc_hvl__buf_1.gds",
391+
"sky130_fd_sc_hvl__buf_2.gds",
392+
"sky130_fd_sc_hvl__buf_4.gds",
393+
"sky130_fd_sc_hvl__buf_32.gds",
394+
"sky130_fd_sc_hvl__buf_16.gds",
395+
"sky130_fd_sc_hvl__buf_8.gds",
396+
"sky130_fd_sc_hvl__einvp_1.gds",
397+
"sky130_fd_sc_hvl__conb_1.gds",
398+
"sky130_fd_sc_hvl__and3_1.gds",
399+
"sky130_fd_sc_hvl__lsbufhv2lv_1.gds",
400+
"sky130_fd_sc_hvl__and2_1.gds",
401+
"sky130_fd_sc_hvl__nor3_1.gds",
402+
"sky130_fd_sc_hvl__dlclkp_1.gds",
403+
"sky130_fd_sc_hvl__lsbuflv2hv_symmetric_1.gds",
404+
"sky130_fd_sc_hvl__sdfstp_1.gds",
405+
"sky130_fd_sc_hvl__dfrbp_1.gds",
406+
"sky130_fd_sc_hvl__dfxbp_1.gds",
407+
"sky130_fd_sc_hvl__nor2_1.gds",
408+
"sky130_fd_sc_hvl__diode_2.gds",
409+
"sky130_fd_sc_hvl__dlrtp_1.gds",
410+
"sky130_fd_sc_hvl__dlxtp_1.gds",
411+
"sky130_fd_sc_hvl__lsbufhv2lv_simple_1.gds",
412+
"sky130_fd_sc_hvl__lsbuflv2hv_clkiso_hlkg_3.gds",
413+
"sky130_fd_sc_hvl__sdlclkp_1.gds",
414+
"sky130_fd_sc_hvl__o22ai_1.gds",
415+
"sky130_fd_sc_hvl__or3_1.gds",
416+
"sky130_fd_sc_hvl__sdfsbp_1.gds",
417+
"sky130_fd_sc_hvl__xor2_1.gds",
418+
"sky130_fd_sc_hvl__mux4_1.gds",
419+
"sky130_fd_sc_hvl__or2_1.gds",
420+
"sky130_fd_sc_hvl__probe_p_8.gds",
421+
"sky130_fd_sc_hvl__dfxtp_1.gds",
422+
"sky130_fd_sc_hvl__mux2_1.gds",
423+
"sky130_fd_sc_hvl__dfrtp_1.gds",
424+
"sky130_fd_sc_hvl__lsbuflv2hv_isosrchvaon_1.gds",
425+
"sky130_fd_sc_hvl__probec_p_8.gds",
426+
"sky130_fd_sc_hvl__xnor2_1.gds",
427+
"sky130_fd_sc_hvl__einvn_1.gds",
428+
"sky130_fd_sc_hvl__o21ai_1.gds",
429+
"sky130_fd_sc_hvl__lsbufhv2hv_lh_1.gds",
430+
"sky130_ef_io__analog.gds",
431+
"sky130_ef_io__bare_pad.gds",
432+
"sky130_ef_io__connect_vcchib_vccd_and_vswitch_vddio_slice_20um.gds",
433+
"sky130_ef_io__disconnect_vccd_slice_5um.gds",
434+
"sky130_ef_io__disconnect_vdda_slice_5um.gds",
435+
"sky130_ef_io__gpiov2_pad_wrapped.gds",
436+
"sky130_ef_sc_hd__decap_12.gds",
437+
"sky130_ef_sc_hd__decap_20_12.gds",
438+
"sky130_ef_sc_hd__decap_40_12.gds",
439+
"sky130_ef_sc_hd__decap_60_12.gds",
440+
"sky130_ef_sc_hd__decap_80_12.gds",
441+
"sky130_ef_sc_hd__fill_12.gds",
442+
"sky130_ef_sc_hd__fill_2.gds",
443+
"sky130_ef_sc_hd__fill_4.gds",
444+
"sky130_ef_sc_hd__fill_8.gds",
445+
"sky130_ef_sc_hvl__fill_8.gds",
446+
"caravel_logo.gds.gz",
447+
"caravel_motto.gds.gz",
448+
"chip_io.gds.gz",
449+
"copyright_block.gds.gz",
450+
"empty_macro.gds.gz",
451+
"manual_power_connections.gds.gz",
452+
"open_source.gds.gz",
453+
"simple_por.gds.gz",
454+
"user_id_programming.gds.gz",
455+
"user_id_textblock.gds.gz",
456+
"RAM128.gds.gz"
457+
};
458+
459+
std::string lefdef_layouts_arg = "--lefdef-lef-layouts=";
460+
for (size_t i = 0; i < sizeof (lefdef_layout_files) / sizeof (lefdef_layout_files[0]); ++i) {
461+
if (i > 0) {
462+
lefdef_layouts_arg += ",";
463+
}
464+
lefdef_layouts_arg += gds_dir + "/" + lefdef_layout_files[i];
465+
}
466+
467+
const char *def_files[] = {
468+
"caravel.def",
469+
"caravel_clocking.def",
470+
"caravel_core.def.gz",
471+
"gpio_defaults_block.def",
472+
"gpio_logic_high.def",
473+
"housekeeping.def",
474+
"mgmt_protect_hv.def",
475+
"mprj2_logic_high.def",
476+
"mprj_io_buffer.def",
477+
"mprj_logic_high.def",
478+
"spare_logic_block.def",
479+
"user_project_wrapper.def",
480+
"xres_buf.def"
481+
};
482+
483+
std::string input;
484+
for (size_t i = 0; i < sizeof (def_files) / sizeof (def_files[0]); ++i) {
485+
if (i > 0) {
486+
input += ",";
487+
}
488+
input += def_dir + "/" + def_files[i];
489+
}
490+
491+
const char *argv[] = { "x",
492+
"--lefdef-no-implicit-lef",
493+
map_arg.c_str (),
494+
lefs_arg.c_str (),
495+
lefdef_layouts_arg.c_str (),
496+
input.c_str (),
497+
output.c_str ()
498+
};
499+
500+
EXPECT_EQ (bd::converter_main (sizeof (argv) / sizeof (argv[0]), (char **) argv, bd::GenericWriterOptions::oasis_format_name), 0);
501+
502+
db::Layout layout;
503+
504+
{
505+
tl::InputStream stream (output);
506+
db::LoadLayoutOptions options;
507+
db::Reader reader (stream);
508+
reader.read (layout, options);
509+
}
510+
511+
db::compare_layouts (this, layout, input_au, db::WriteOAS);
512+
}

src/db/db/dbCommonReader.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,13 @@ CommonReaderBase::merge_cell_without_instances (db::Layout &layout, db::cell_ind
314314
}
315315

316316
void
317-
CommonReaderBase::init ()
317+
CommonReaderBase::start ()
318318
{
319+
m_id_map.clear ();
320+
m_name_map.clear ();
321+
m_temp_cells.clear ();
322+
m_name_for_id.clear ();
323+
319324
m_layer_map_out.clear ();
320325
m_multi_mapping_placeholders.clear ();
321326
m_layer_cache.clear ();
@@ -621,7 +626,7 @@ void
621626
CommonReader::init (const LoadLayoutOptions &options)
622627
{
623628
ReaderBase::init (options);
624-
CommonReaderBase::init ();
629+
CommonReaderBase::start ();
625630

626631
db::CommonReaderOptions common_options = options.get_options<db::CommonReaderOptions> ();
627632
set_conflict_resolution_mode (common_options.cell_conflict_resolution);

src/db/db/dbCommonReader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ class DB_PUBLIC CommonReaderBase
207207
/**
208208
* @brief Re-initialize: clears the tables and caches
209209
*/
210-
void init ();
210+
void start ();
211211

212212
/**
213213
* @brief Sets a value indicating whether to create layers

0 commit comments

Comments
 (0)