@@ -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+ }
0 commit comments