2018-06-14 23:38:23 +02:00
/*
KLayout Layout Viewer
2025-01-04 19:28:56 +01:00
Copyright ( C ) 2006 - 2025 Matthias Koefferlein
2018-06-14 23:38:23 +02:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include "tlTimer.h"
# include "tlStream.h"
2018-07-03 00:51:36 +02:00
# include "tlFileUtils.h"
2018-06-14 23:38:23 +02:00
# include "dbReader.h"
# include "dbStream.h"
# include "dbLEFImporter.h"
# include "dbDEFImporter.h"
# include "dbLEFDEFImporter.h"
2020-04-19 16:54:41 +02:00
# include "dbLayoutUtils.h"
2020-05-02 00:14:06 +02:00
# include "dbTechnology.h"
2020-08-30 01:37:14 +02:00
# include "dbCellMapping.h"
2018-06-14 23:38:23 +02:00
namespace db
{
// ---------------------------------------------------------------
// Plugin for the stream reader
/**
* @ brief Determines the format of the given stream
* Returns true , if the stream has LEF format
*/
static bool is_lef_format ( const std : : string & fn )
{
static const char * suffixes [ ] = { " .lef " , " .LEF " , " .lef.gz " , " .LEF.gz " } ;
// NOTE: there is no reliable way of (easily) detecting the format. Hence we use the file
// name's suffix for the format hint.
for ( size_t i = 0 ; i < sizeof ( suffixes ) / sizeof ( suffixes [ 0 ] ) ; + + i ) {
std : : string suffix = suffixes [ i ] ;
if ( fn . size ( ) > suffix . size ( ) & & fn . find ( suffix ) = = fn . size ( ) - suffix . size ( ) ) {
return true ;
}
}
return false ;
}
/**
* @ brief Determines the format of the given stream
* Returns true , if the stream has DEF format
*/
static bool is_def_format ( const std : : string & fn )
{
static const char * suffixes [ ] = { " .def " , " .DEF " , " .def.gz " , " .DEF.gz " } ;
// NOTE: there is no reliable way of (easily) detecting the format. Hence we use the file
// name's suffix for the format hint.
for ( size_t i = 0 ; i < sizeof ( suffixes ) / sizeof ( suffixes [ 0 ] ) ; + + i ) {
std : : string suffix = suffixes [ i ] ;
if ( fn . size ( ) > suffix . size ( ) & & fn . find ( suffix ) = = fn . size ( ) - suffix . size ( ) ) {
return true ;
}
}
return false ;
}
2021-05-04 22:56:03 +02:00
// ---------------------------------------------------------------
// LEFDEFReader implementation
LEFDEFReader : : LEFDEFReader ( tl : : InputStream & s )
: m_stream ( s )
2018-06-14 23:38:23 +02:00
{
2021-05-04 22:56:03 +02:00
// .. nothing yet ..
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
const db : : LayerMap &
LEFDEFReader : : read ( db : : Layout & layout , const db : : LoadLayoutOptions & options )
{
return read_lefdef ( layout , options , is_lef_format ( m_stream . filename ( ) ) ) ;
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
const db : : LayerMap &
LEFDEFReader : : read ( db : : Layout & layout )
{
return read_lefdef ( layout , db : : LoadLayoutOptions ( ) , is_lef_format ( m_stream . filename ( ) ) ) ;
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
const char *
LEFDEFReader : : format ( ) const
{
return " LEFDEF " ;
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
const db : : LayerMap &
LEFDEFReader : : read_lefdef ( db : : Layout & layout , const db : : LoadLayoutOptions & options , bool import_lef )
{
2022-08-13 22:15:07 +02:00
init ( options ) ;
2021-05-04 22:56:03 +02:00
const db : : LEFDEFReaderOptions * lefdef_options = dynamic_cast < const db : : LEFDEFReaderOptions * > ( options . get_options ( format ( ) ) ) ;
db : : LEFDEFReaderOptions effective_options ;
if ( lefdef_options ) {
effective_options = * lefdef_options ;
2018-06-14 23:38:23 +02:00
}
2020-05-02 00:14:06 +02:00
2022-03-07 22:18:09 +01:00
std : : string base_path ;
if ( ! effective_options . paths_relative_to_cwd ( ) ) {
2024-11-23 19:19:23 +01:00
base_path = tl : : dirname ( m_stream . absolute_file_path ( ) ) ;
2022-03-07 22:18:09 +01:00
}
db : : LEFDEFReaderState state ( & effective_options , layout , base_path ) ;
2018-06-14 23:38:23 +02:00
2022-04-23 22:26:37 +02:00
db : : CommonReaderOptions common_options = options . get_options < db : : CommonReaderOptions > ( ) ;
state . set_conflict_resolution_mode ( common_options . cell_conflict_resolution ) ;
2021-05-04 22:56:03 +02:00
layout . dbu ( effective_options . dbu ( ) ) ;
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
if ( import_lef ) {
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
// Always produce LEF geometry when reading LEF
effective_options . set_macro_resolution_mode ( 1 ) ;
2020-12-14 22:46:07 +01:00
2021-05-04 22:56:03 +02:00
tl : : SelfTimer timer ( tl : : verbosity ( ) > = 21 , tl : : to_string ( tr ( " Reading LEF file " ) ) ) ;
2018-06-14 23:38:23 +02:00
2022-08-13 22:15:07 +02:00
db : : LEFImporter importer ( warn_level ( ) ) ;
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
for ( std : : vector < std : : string > : : const_iterator l = effective_options . begin_lef_files ( ) ; l ! = effective_options . end_lef_files ( ) ; + + l ) {
2018-06-14 23:38:23 +02:00
2025-04-06 19:21:02 +02:00
auto paths = correct_path ( * l , layout , base_path , true ) ;
for ( auto lp = paths . begin ( ) ; lp ! = paths . end ( ) ; + + lp ) {
tl : : InputStream lef_stream ( * lp ) ;
tl : : log < < tl : : to_string ( tr ( " Reading " ) ) < < " " < < * lp ;
importer . read ( lef_stream , layout , state ) ;
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
tl : : log < < tl : : to_string ( tr ( " Reading " ) ) < < " " < < m_stream . source ( ) ;
importer . read ( m_stream , layout , state ) ;
2020-08-23 01:29:10 +02:00
2021-05-04 22:56:03 +02:00
importer . finish_lef ( layout ) ;
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
} else {
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
tl : : SelfTimer timer ( tl : : verbosity ( ) > = 21 , tl : : to_string ( tr ( " Reading DEF file " ) ) ) ;
2018-06-14 23:38:23 +02:00
2022-08-13 22:15:07 +02:00
DEFImporter importer ( warn_level ( ) ) ;
2018-06-14 23:38:23 +02:00
2024-05-30 16:21:52 +02:00
std : : set < std : : string > lef_files_read ;
2021-05-04 22:56:03 +02:00
for ( std : : vector < std : : string > : : const_iterator l = effective_options . begin_lef_files ( ) ; l ! = effective_options . end_lef_files ( ) ; + + l ) {
2018-06-14 23:38:23 +02:00
2025-04-06 19:21:02 +02:00
auto paths = correct_path ( * l , layout , base_path , true ) ;
for ( auto lp = paths . begin ( ) ; lp ! = paths . end ( ) ; + + lp ) {
if ( lef_files_read . insert ( tl : : normalize_path ( * lp ) ) . second ) {
2020-08-22 19:09:30 +02:00
2025-04-06 19:21:02 +02:00
tl : : SelfTimer timer ( tl : : verbosity ( ) > = 21 , tl : : to_string ( tr ( " Reading LEF file: " ) ) + * lp ) ;
2018-06-14 23:38:23 +02:00
2025-04-06 19:21:02 +02:00
tl : : InputStream lef_stream ( * lp ) ;
tl : : log < < tl : : to_string ( tr ( " Reading " ) ) < < " " < < * lp ;
importer . read_lef ( lef_stream , layout , state ) ;
}
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
// Additionally read all LEF files next to the DEF file
2020-03-29 18:57:07 +02:00
2021-05-04 22:56:03 +02:00
if ( effective_options . read_lef_with_def ( ) ) {
2018-06-14 23:38:23 +02:00
2024-11-23 19:19:23 +01:00
std : : string input_dir = tl : : absolute_path ( m_stream . absolute_file_path ( ) ) ;
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
if ( tl : : file_exists ( input_dir ) ) {
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
std : : vector < std : : string > entries = tl : : dir_entries ( input_dir , true , false , true ) ;
for ( std : : vector < std : : string > : : const_iterator e = entries . begin ( ) ; e ! = entries . end ( ) ; + + e ) {
2020-04-25 22:05:01 +02:00
2021-05-04 22:56:03 +02:00
if ( is_lef_format ( * e ) ) {
2020-04-25 22:05:01 +02:00
2021-05-04 22:56:03 +02:00
std : : string lp = tl : : combine_path ( input_dir , * e ) ;
2020-08-19 23:06:46 +02:00
2024-05-30 16:21:52 +02:00
// skip if already read (issue-1724)
if ( lef_files_read . find ( tl : : normalize_path ( lp ) ) = = lef_files_read . end ( ) ) {
tl : : SelfTimer timer ( tl : : verbosity ( ) > = 21 , tl : : to_string ( tr ( " Reading LEF file: " ) ) + lp ) ;
tl : : InputStream lef_stream ( lp ) ;
tl : : log < < tl : : to_string ( tr ( " Reading " ) ) < < " " < < lp ;
importer . read_lef ( lef_stream , layout , state ) ;
2020-08-19 23:06:46 +02:00
2024-05-30 16:21:52 +02:00
}
2018-06-14 23:38:23 +02:00
}
}
}
2021-05-04 22:56:03 +02:00
}
2018-06-14 23:38:23 +02:00
2021-05-04 22:56:03 +02:00
tl : : log < < tl : : to_string ( tr ( " Reading " ) ) < < " " < < m_stream . source ( ) ;
importer . read ( m_stream , layout , state ) ;
2020-08-30 01:37:14 +02:00
2021-05-04 22:56:03 +02:00
// Resolve unresolved COMPONENT cells
2020-08-30 01:37:14 +02:00
2021-05-04 22:56:03 +02:00
std : : map < std : : string , db : : cell_index_type > foreign_cells = state . foreign_cells ( ) ;
db : : cell_index_type seen = std : : numeric_limits < db : : cell_index_type > : : max ( ) ;
2020-08-30 01:37:14 +02:00
2021-05-04 22:56:03 +02:00
std : : vector < db : : Layout * > macro_layouts = effective_options . macro_layouts ( ) ;
2020-08-30 01:37:14 +02:00
2021-05-04 22:56:03 +02:00
// Additionally read the layouts from the given paths
tl : : shared_collection < db : : Layout > macro_layout_object_holder ;
for ( std : : vector < std : : string > : : const_iterator l = effective_options . begin_macro_layout_files ( ) ; l ! = effective_options . end_macro_layout_files ( ) ; + + l ) {
2020-08-30 01:37:14 +02:00
2025-04-06 19:21:02 +02:00
auto paths = correct_path ( * l , layout , base_path , true ) ;
for ( auto lp = paths . begin ( ) ; lp ! = paths . end ( ) ; + + lp ) {
2020-08-30 01:37:14 +02:00
2025-04-06 19:21:02 +02:00
tl : : SelfTimer timer ( tl : : verbosity ( ) > = 21 , tl : : to_string ( tr ( " Reading LEF macro layout file: " ) ) + * lp ) ;
2021-05-04 22:56:03 +02:00
2025-04-06 19:21:02 +02:00
tl : : InputStream macro_layout_stream ( * lp ) ;
tl : : log < < tl : : to_string ( tr ( " Reading " ) ) < < " " < < * lp ;
db : : Layout * new_layout = new db : : Layout ( false ) ;
macro_layout_object_holder . push_back ( new_layout ) ;
macro_layouts . push_back ( new_layout ) ;
2021-05-04 22:56:03 +02:00
2025-04-06 19:21:02 +02:00
db : : Reader reader ( macro_layout_stream ) ;
reader . read ( * new_layout , options ) ;
if ( fabs ( new_layout - > dbu ( ) / layout . dbu ( ) - 1.0 ) > db : : epsilon ) {
importer . warn ( tl : : sprintf ( tl : : to_string ( tr ( " DBU of macro layout file '%s' does not match reader DBU (layout DBU is %.12g, reader DBU is set to %.12g) " ) ) ,
* lp , new_layout - > dbu ( ) , layout . dbu ( ) ) ) ;
}
2020-08-30 01:37:14 +02:00
2024-05-18 19:41:22 +02:00
}
2018-06-14 23:38:23 +02:00
}
2021-05-04 22:56:03 +02:00
for ( std : : vector < db : : Layout * > : : const_iterator m = macro_layouts . begin ( ) ; m ! = macro_layouts . end ( ) ; + + m ) {
std : : vector < db : : cell_index_type > target_cells , source_cells ;
// collect the cells to pull in
for ( std : : map < std : : string , db : : cell_index_type > : : iterator f = foreign_cells . begin ( ) ; f ! = foreign_cells . end ( ) ; + + f ) {
if ( f - > second ! = seen ) {
std : : pair < bool , db : : cell_index_type > cp = ( * m ) - > cell_by_name ( f - > first . c_str ( ) ) ;
if ( cp . first ) {
target_cells . push_back ( f - > second ) ;
source_cells . push_back ( cp . second ) ;
layout . cell ( f - > second ) . set_ghost_cell ( false ) ;
f - > second = seen ;
}
}
}
db : : CellMapping cm ;
cm . create_multi_mapping_full ( layout , target_cells , * * m , source_cells ) ;
layout . copy_tree_shapes ( * * m , cm ) ;
}
2018-06-14 23:38:23 +02:00
2025-04-08 22:40:04 +02:00
// Warn about cells that could not be resolved
for ( std : : map < std : : string , db : : cell_index_type > : : iterator f = foreign_cells . begin ( ) ; f ! = foreign_cells . end ( ) ; + + f ) {
2025-04-08 23:52:50 +02:00
if ( f - > second ! = seen & & layout . cell ( f - > second ) . is_ghost_cell ( ) ) {
2025-04-08 22:40:04 +02:00
importer . warn ( tl : : sprintf ( tl : : to_string ( tr ( " Could not find a substitution layout for foreign cell '%s' " ) ) ,
f - > first ) ) ;
}
}
2018-06-14 23:38:23 +02:00
}
2021-05-04 22:56:03 +02:00
state . finish ( layout ) ;
m_layer_map = state . layer_map ( ) ;
return m_layer_map ;
}
// ---------------------------------------------------------------
2018-06-14 23:38:23 +02:00
2020-05-02 00:14:06 +02:00
namespace {
struct MacroResolutionModeConverter
{
public :
MacroResolutionModeConverter ( )
{
m_values . push_back ( " default " ) ;
m_values . push_back ( " always-lef " ) ;
m_values . push_back ( " always-cellref " ) ;
}
std : : string to_string ( unsigned int v ) const
{
return v < m_values . size ( ) ? m_values [ v ] : std : : string ( ) ;
}
void from_string ( const std : : string & s , unsigned int & v ) const
{
v = 0 ;
for ( unsigned int i = 0 ; i < ( unsigned int ) m_values . size ( ) ; + + i ) {
if ( m_values [ i ] = = s ) {
v = i ;
}
}
}
private :
std : : vector < std : : string > m_values ;
} ;
}
2018-06-14 23:38:23 +02:00
class LEFDEFFormatDeclaration
: public db : : StreamFormatDeclaration
{
virtual std : : string format_name ( ) const { return " LEFDEF " ; }
virtual std : : string format_desc ( ) const { return " LEF/DEF " ; }
virtual std : : string format_title ( ) const { return " LEF/DEF (unified reader) " ; }
virtual std : : string file_format ( ) const { return " LEF/DEF files (*.lef *.LEF *.lef.gz *.LEF.gz *.def *.DEF *.def.gz *.DEF.gz) " ; }
virtual bool detect ( tl : : InputStream & stream ) const
{
return is_lef_format ( stream . filename ( ) ) | | is_def_format ( stream . filename ( ) ) ;
}
virtual db : : ReaderBase * create_reader ( tl : : InputStream & s ) const
{
return new db : : LEFDEFReader ( s ) ;
}
virtual db : : WriterBase * create_writer ( ) const
{
return 0 ;
}
virtual bool can_read ( ) const
{
return true ;
}
virtual bool can_write ( ) const
{
return false ;
}
virtual tl : : XMLElementBase * xml_reader_options_element ( ) const
{
return new db : : ReaderOptionsXMLElement < LEFDEFReaderOptions > ( " lefdef " ,
tl : : make_member ( & LEFDEFReaderOptions : : read_all_layers , & LEFDEFReaderOptions : : set_read_all_layers , " read-all-layers " ) +
tl : : make_member ( & LEFDEFReaderOptions : : layer_map , & LEFDEFReaderOptions : : set_layer_map , " layer-map " ) +
tl : : make_member ( & LEFDEFReaderOptions : : dbu , & LEFDEFReaderOptions : : set_dbu , " dbu " ) +
tl : : make_member ( & LEFDEFReaderOptions : : produce_net_names , & LEFDEFReaderOptions : : set_produce_net_names , " produce-net-names " ) +
tl : : make_member ( & LEFDEFReaderOptions : : net_property_name , & LEFDEFReaderOptions : : set_net_property_name , " net-property-name " ) +
tl : : make_member ( & LEFDEFReaderOptions : : produce_inst_names , & LEFDEFReaderOptions : : set_produce_inst_names , " produce-inst-names " ) +
tl : : make_member ( & LEFDEFReaderOptions : : inst_property_name , & LEFDEFReaderOptions : : set_inst_property_name , " inst-property-name " ) +
2020-02-23 00:29:12 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_pin_names , & LEFDEFReaderOptions : : set_produce_pin_names , " produce-pin-names " ) +
tl : : make_member ( & LEFDEFReaderOptions : : pin_property_name , & LEFDEFReaderOptions : : set_pin_property_name , " pin-property-name " ) +
2021-12-07 23:40:26 +01:00
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_cell_outlines , & LEFDEFReaderOptions : : set_produce_cell_outlines , " produce-cell-outlines " ) +
tl : : make_member ( & LEFDEFReaderOptions : : cell_outline_layer , & LEFDEFReaderOptions : : set_cell_outline_layer , " cell-outline-layer " ) +
2021-12-07 23:40:26 +01:00
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_placement_blockages , & LEFDEFReaderOptions : : set_produce_placement_blockages , " produce-placement-blockages " ) +
tl : : make_member ( & LEFDEFReaderOptions : : placement_blockage_layer , & LEFDEFReaderOptions : : set_placement_blockage_layer , " placement-blockage-layer " ) +
2021-12-07 23:40:26 +01:00
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_regions , & LEFDEFReaderOptions : : set_produce_regions , " produce-regions " ) +
tl : : make_member ( & LEFDEFReaderOptions : : region_layer , & LEFDEFReaderOptions : : set_region_layer , " region-layer " ) +
2021-12-07 23:40:26 +01:00
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_via_geometry , & LEFDEFReaderOptions : : set_produce_via_geometry , " produce-via-geometry " ) +
2020-07-18 22:28:14 +02:00
// for backward compatibility
tl : : make_member ( & LEFDEFReaderOptions : : set_via_geometry_suffix , " special-via_geometry-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_via_geometry_datatype , " special-via_geometry-datatype " ) +
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : set_via_geometry_suffix_str , " special-via_geometry-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_via_geometry_datatype_str , " special-via_geometry-datatype-string " ) +
2020-07-18 22:28:14 +02:00
// new:
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : via_geometry_suffix_str , & LEFDEFReaderOptions : : set_via_geometry_suffix_str , " via_geometry-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : via_geometry_datatype_str , & LEFDEFReaderOptions : : set_via_geometry_datatype_str , " via_geometry-datatype-string " ) +
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_pins , & LEFDEFReaderOptions : : set_produce_pins , " produce-pins " ) +
2020-07-18 22:28:14 +02:00
// for backward compatibility
tl : : make_member ( & LEFDEFReaderOptions : : set_pins_suffix , " special-pins-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_pins_datatype , " special-pins-datatype " ) +
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : set_pins_suffix_str , " special-pins-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_pins_datatype_str , " special-pins-datatype-string " ) +
2020-07-18 22:28:14 +02:00
// new:
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : pins_suffix_str , & LEFDEFReaderOptions : : set_pins_suffix_str , " pins-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : pins_datatype_str , & LEFDEFReaderOptions : : set_pins_datatype_str , " pins-datatype-string " ) +
2020-04-19 14:38:14 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_lef_pins , & LEFDEFReaderOptions : : set_produce_lef_pins , " produce-lef-pins " ) +
2020-07-18 22:28:14 +02:00
// for backward compatibility
tl : : make_member ( & LEFDEFReaderOptions : : set_lef_pins_suffix , " special-lef_pins-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_lef_pins_datatype , " special-lef_pins-datatype " ) +
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : set_lef_pins_suffix_str , " special-lef_pins-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_lef_pins_datatype_str , " special-lef_pins-datatype-string " ) +
2020-07-18 22:28:14 +02:00
// new:
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : lef_pins_suffix_str , & LEFDEFReaderOptions : : set_lef_pins_suffix_str , " lef_pins-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : lef_pins_datatype_str , & LEFDEFReaderOptions : : set_lef_pins_datatype_str , " lef_pins-datatype-string " ) +
2021-02-21 17:28:58 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_fills , & LEFDEFReaderOptions : : set_produce_fills , " produce-fills " ) +
// for backward compatibility
tl : : make_member ( & LEFDEFReaderOptions : : set_fills_suffix , " special-fills-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_fills_datatype , " special-fills-datatype " ) +
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : set_fills_suffix_str , " special-fills-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_fills_datatype_str , " special-fills-datatype-string " ) +
2021-02-21 17:28:58 +01:00
// new:
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : fills_suffix_str , & LEFDEFReaderOptions : : set_fills_suffix_str , " fills-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : fills_datatype_str , & LEFDEFReaderOptions : : set_fills_datatype_str , " fills-datatype-string " ) +
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_obstructions , & LEFDEFReaderOptions : : set_produce_obstructions , " produce-obstructions " ) +
tl : : make_member ( & LEFDEFReaderOptions : : obstructions_suffix , & LEFDEFReaderOptions : : set_obstructions_suffix , " obstructions-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : obstructions_datatype , & LEFDEFReaderOptions : : set_obstructions_datatype , " obstructions-datatype " ) +
2021-12-07 23:40:26 +01:00
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_blockages , & LEFDEFReaderOptions : : set_produce_blockages , " produce-blockages " ) +
tl : : make_member ( & LEFDEFReaderOptions : : blockages_suffix , & LEFDEFReaderOptions : : set_blockages_suffix , " blockages-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : blockages_datatype , & LEFDEFReaderOptions : : set_blockages_datatype , " blockages-datatype " ) +
2021-12-07 23:40:26 +01:00
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_labels , & LEFDEFReaderOptions : : set_produce_labels , " produce-labels " ) +
tl : : make_member ( & LEFDEFReaderOptions : : labels_suffix , & LEFDEFReaderOptions : : set_labels_suffix , " labels-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : labels_datatype , & LEFDEFReaderOptions : : set_labels_datatype , " labels-datatype " ) +
2021-06-08 22:16:10 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_lef_labels , & LEFDEFReaderOptions : : set_produce_lef_labels , " produce-lef-labels " ) +
tl : : make_member ( & LEFDEFReaderOptions : : lef_labels_suffix , & LEFDEFReaderOptions : : set_lef_labels_suffix , " lef-labels-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : lef_labels_datatype , & LEFDEFReaderOptions : : set_lef_labels_datatype , " lef-labels-datatype " ) +
2021-12-07 23:40:26 +01:00
2018-06-14 23:38:23 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_routing , & LEFDEFReaderOptions : : set_produce_routing , " produce-routing " ) +
2021-12-07 23:40:26 +01:00
tl : : make_member ( & LEFDEFReaderOptions : : routing_suffix_str , & LEFDEFReaderOptions : : set_routing_suffix_str , " routing-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : routing_datatype_str , & LEFDEFReaderOptions : : set_routing_datatype_str , " routing-datatype-string " ) +
2020-04-19 14:38:14 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : produce_special_routing , & LEFDEFReaderOptions : : set_produce_special_routing , " produce-special-routing " ) +
2020-07-18 22:28:14 +02:00
// for backward compatibility
tl : : make_member ( & LEFDEFReaderOptions : : set_special_routing_suffix , " special-routing-suffix " ) +
tl : : make_member ( & LEFDEFReaderOptions : : set_special_routing_datatype , " special-routing-datatype " ) +
// new:
tl : : make_member ( & LEFDEFReaderOptions : : special_routing_suffix_str , & LEFDEFReaderOptions : : set_special_routing_suffix_str , " special-routing-suffix-string " ) +
tl : : make_member ( & LEFDEFReaderOptions : : special_routing_datatype_str , & LEFDEFReaderOptions : : set_special_routing_datatype_str , " special-routing-datatype-string " ) +
2021-12-07 23:40:26 +01:00
2020-08-02 12:10:04 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : via_cellname_prefix , & LEFDEFReaderOptions : : set_via_cellname_prefix , " via-cellname-prefix " ) +
2020-05-02 00:14:06 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : begin_lef_files , & LEFDEFReaderOptions : : end_lef_files , & LEFDEFReaderOptions : : push_lef_file , " lef-files " ) +
2021-05-04 22:56:03 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : begin_macro_layout_files , & LEFDEFReaderOptions : : end_macro_layout_files , & LEFDEFReaderOptions : : push_macro_layout_file , " macro_layout-files " ) +
2020-08-19 23:06:46 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : read_lef_with_def , & LEFDEFReaderOptions : : set_read_lef_with_def , " read-lef-with-def " ) +
2020-05-02 00:14:06 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : macro_resolution_mode , & LEFDEFReaderOptions : : set_macro_resolution_mode , " macro-resolution-mode " , MacroResolutionModeConverter ( ) ) +
tl : : make_member ( & LEFDEFReaderOptions : : separate_groups , & LEFDEFReaderOptions : : set_separate_groups , " separate-groups " ) +
2023-04-30 14:47:52 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : joined_paths , & LEFDEFReaderOptions : : set_joined_paths , " joined-paths " ) +
2020-05-02 00:14:06 +02:00
tl : : make_member ( & LEFDEFReaderOptions : : map_file , & LEFDEFReaderOptions : : set_map_file , " map-file " )
2018-06-14 23:38:23 +02:00
) ;
}
} ;
static tl : : RegisteredClass < db : : StreamFormatDeclaration > format_decl ( new LEFDEFFormatDeclaration ( ) , 500 , " LEFDEF " ) ;
}