more specctra dsn work
This commit is contained in:
parent
b2e11dc9d2
commit
da3f44305b
|
@ -155,6 +155,7 @@ const static KEYWORD tokens[] = {
|
||||||
TOKDEF(gap),
|
TOKDEF(gap),
|
||||||
TOKDEF(gate),
|
TOKDEF(gate),
|
||||||
TOKDEF(gates),
|
TOKDEF(gates),
|
||||||
|
TOKDEF(generated_by_freeroute),
|
||||||
TOKDEF(global),
|
TOKDEF(global),
|
||||||
TOKDEF(grid),
|
TOKDEF(grid),
|
||||||
TOKDEF(group),
|
TOKDEF(group),
|
||||||
|
@ -280,10 +281,10 @@ const static KEYWORD tokens[] = {
|
||||||
TOKDEF(pin),
|
TOKDEF(pin),
|
||||||
TOKDEF(pin_allow),
|
TOKDEF(pin_allow),
|
||||||
TOKDEF(pin_cap_via),
|
TOKDEF(pin_cap_via),
|
||||||
TOKDEF(pins),
|
|
||||||
TOKDEF(pintype),
|
|
||||||
TOKDEF(pin_via_cap),
|
TOKDEF(pin_via_cap),
|
||||||
TOKDEF(pin_width_taper),
|
TOKDEF(pin_width_taper),
|
||||||
|
TOKDEF(pins),
|
||||||
|
TOKDEF(pintype),
|
||||||
TOKDEF(place),
|
TOKDEF(place),
|
||||||
TOKDEF(place_boundary),
|
TOKDEF(place_boundary),
|
||||||
TOKDEF(place_control),
|
TOKDEF(place_control),
|
||||||
|
@ -331,8 +332,8 @@ const static KEYWORD tokens[] = {
|
||||||
TOKDEF(round),
|
TOKDEF(round),
|
||||||
TOKDEF(roundoff_rotation),
|
TOKDEF(roundoff_rotation),
|
||||||
TOKDEF(route),
|
TOKDEF(route),
|
||||||
TOKDEF(routes),
|
|
||||||
TOKDEF(route_to_fanout_only),
|
TOKDEF(route_to_fanout_only),
|
||||||
|
TOKDEF(routes),
|
||||||
TOKDEF(routes_include),
|
TOKDEF(routes_include),
|
||||||
TOKDEF(rule),
|
TOKDEF(rule),
|
||||||
TOKDEF(same_net_checking),
|
TOKDEF(same_net_checking),
|
||||||
|
|
|
@ -155,6 +155,7 @@ enum DSN_T {
|
||||||
T_gap,
|
T_gap,
|
||||||
T_gate,
|
T_gate,
|
||||||
T_gates,
|
T_gates,
|
||||||
|
T_generated_by_freeroute,
|
||||||
T_global,
|
T_global,
|
||||||
T_grid,
|
T_grid,
|
||||||
T_group,
|
T_group,
|
||||||
|
@ -280,10 +281,10 @@ enum DSN_T {
|
||||||
T_pin,
|
T_pin,
|
||||||
T_pin_allow,
|
T_pin_allow,
|
||||||
T_pin_cap_via,
|
T_pin_cap_via,
|
||||||
T_pins,
|
|
||||||
T_pintype,
|
|
||||||
T_pin_via_cap,
|
T_pin_via_cap,
|
||||||
T_pin_width_taper,
|
T_pin_width_taper,
|
||||||
|
T_pins,
|
||||||
|
T_pintype,
|
||||||
T_place,
|
T_place,
|
||||||
T_place_boundary,
|
T_place_boundary,
|
||||||
T_place_control,
|
T_place_control,
|
||||||
|
@ -331,8 +332,8 @@ enum DSN_T {
|
||||||
T_round,
|
T_round,
|
||||||
T_roundoff_rotation,
|
T_roundoff_rotation,
|
||||||
T_route,
|
T_route,
|
||||||
T_routes,
|
|
||||||
T_route_to_fanout_only,
|
T_route_to_fanout_only,
|
||||||
|
T_routes,
|
||||||
T_routes_include,
|
T_routes_include,
|
||||||
T_rule,
|
T_rule,
|
||||||
T_same_net_checking,
|
T_same_net_checking,
|
||||||
|
|
|
@ -334,6 +334,7 @@ class PARSER : public ELEM
|
||||||
bool routes_include_guides;
|
bool routes_include_guides;
|
||||||
bool routes_include_image_conductor;
|
bool routes_include_image_conductor;
|
||||||
bool via_rotate_first;
|
bool via_rotate_first;
|
||||||
|
bool generated_by_freeroute;
|
||||||
|
|
||||||
std::string const_id1;
|
std::string const_id1;
|
||||||
std::string const_id2;
|
std::string const_id2;
|
||||||
|
@ -356,6 +357,7 @@ public:
|
||||||
routes_include_guides = false;
|
routes_include_guides = false;
|
||||||
routes_include_image_conductor = false;
|
routes_include_image_conductor = false;
|
||||||
via_rotate_first = true;
|
via_rotate_first = true;
|
||||||
|
generated_by_freeroute = false;
|
||||||
|
|
||||||
host_cad = "Kicad's PCBNEW";
|
host_cad = "Kicad's PCBNEW";
|
||||||
host_version = CONV_TO_UTF8(g_BuildVersion);
|
host_version = CONV_TO_UTF8(g_BuildVersion);
|
||||||
|
@ -1890,6 +1892,10 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PIN_REF
|
||||||
|
* corresponds to the <pin_reference> definition in the specctra dsn spec.
|
||||||
|
*/
|
||||||
class PIN_REF : public ELEM
|
class PIN_REF : public ELEM
|
||||||
{
|
{
|
||||||
friend class SPECCTRA_DB;
|
friend class SPECCTRA_DB;
|
||||||
|
@ -1906,11 +1912,14 @@ public:
|
||||||
|
|
||||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||||
{
|
{
|
||||||
out->Print( nestLevel, "\"%s\"-\"%s\"\n",
|
// only print the newline if there is a nest level, and make
|
||||||
component_id.c_str(), pin_id.c_str() );
|
// the quotes unconditional on this one.
|
||||||
|
const char* newline = nestLevel ? "\n" : "";
|
||||||
|
out->Print( nestLevel, "\"%s\"-\"%s\"%s",
|
||||||
|
component_id.c_str(), pin_id.c_str(), newline );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
typedef std::vector<PIN_REF> PIN_REFS;
|
||||||
|
|
||||||
|
|
||||||
class FROMTO : public ELEM
|
class FROMTO : public ELEM
|
||||||
|
@ -2023,7 +2032,6 @@ class NET : public ELEM
|
||||||
|
|
||||||
DSN_T pins_type; ///< T_pins | T_order
|
DSN_T pins_type; ///< T_pins | T_order
|
||||||
|
|
||||||
typedef std::vector<PIN_REF> PIN_REFS;
|
|
||||||
PIN_REFS pins;
|
PIN_REFS pins;
|
||||||
|
|
||||||
DSN_T type; ///< T_fix | T_normal
|
DSN_T type; ///< T_fix | T_normal
|
||||||
|
@ -2661,18 +2669,110 @@ class ROUTE : public ELEM
|
||||||
{
|
{
|
||||||
friend class SPECCTRA_DB;
|
friend class SPECCTRA_DB;
|
||||||
|
|
||||||
std::string session_id;
|
UNIT_RES* resolution;
|
||||||
std::string base_design;
|
PARSER* parser;
|
||||||
|
STRUCTURE* structure;
|
||||||
|
LIBRARY* library;
|
||||||
|
NETWORK* network;
|
||||||
|
// TEST_POINTS* test_points;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ROUTE( ELEM* aParent ) :
|
ROUTE( ELEM* aParent ) :
|
||||||
ELEM( T_route, aParent )
|
ELEM( T_route, aParent )
|
||||||
{
|
{
|
||||||
|
resolution = 0;
|
||||||
|
parser = 0;
|
||||||
|
structure = 0;
|
||||||
|
library = 0;
|
||||||
|
network = 0;
|
||||||
|
}
|
||||||
|
~ROUTE()
|
||||||
|
{
|
||||||
|
delete resolution;
|
||||||
|
delete parser;
|
||||||
|
delete structure;
|
||||||
|
delete library;
|
||||||
|
delete network;
|
||||||
|
// delete test_points;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||||
|
{
|
||||||
|
if( resolution )
|
||||||
|
resolution->Format( out, nestLevel );
|
||||||
|
|
||||||
|
if( parser )
|
||||||
|
parser->Format( out, nestLevel );
|
||||||
|
|
||||||
|
if( structure )
|
||||||
|
structure->Format( out, nestLevel );
|
||||||
|
|
||||||
|
if( library )
|
||||||
|
library->Format( out, nestLevel );
|
||||||
|
|
||||||
|
if( network )
|
||||||
|
library->Format( out, nestLevel );
|
||||||
|
|
||||||
|
// if( test_poinst )
|
||||||
|
// test_points->Format( out, nestLevel );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct PIN_PAIR
|
||||||
|
* is used within the WAS_IS class below to hold a pair of PIN_REFs and
|
||||||
|
* corresponds to the (pins was is) construct within the specctra dsn spec.
|
||||||
|
*/
|
||||||
|
struct PIN_PAIR
|
||||||
|
{
|
||||||
|
PIN_PAIR( ELEM* aParent = 0 ) :
|
||||||
|
was( aParent ),
|
||||||
|
is( aParent )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PIN_REF was;
|
||||||
|
PIN_REF is;
|
||||||
|
};
|
||||||
|
typedef std::vector<PIN_PAIR> PIN_PAIRS;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class WAS_IS
|
||||||
|
* corresponds to the <was_is_descriptor> in the specctra dsn spec.
|
||||||
|
*/
|
||||||
|
class WAS_IS : public ELEM
|
||||||
|
{
|
||||||
|
friend class SPECCTRA_DB;
|
||||||
|
|
||||||
|
PIN_PAIRS pin_pairs;
|
||||||
|
|
||||||
|
public:
|
||||||
|
WAS_IS( ELEM* aParent ) :
|
||||||
|
ELEM( T_was_is, aParent )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||||
|
{
|
||||||
|
for( PIN_PAIRS::iterator i=pin_pairs.begin(); i!=pin_pairs.end(); ++i )
|
||||||
|
{
|
||||||
|
out->Print( nestLevel, "(pins " );
|
||||||
|
i->was.Format( out, 0 );
|
||||||
|
out->Print( 0, " " );
|
||||||
|
i->is.Format( out, 0 );
|
||||||
|
out->Print( 0, ")\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SESSION
|
||||||
|
* corresponds to the <session_file_descriptor> in the specctra dsn spec.
|
||||||
|
*/
|
||||||
class SESSION : public ELEM
|
class SESSION : public ELEM
|
||||||
{
|
{
|
||||||
friend class SPECCTRA_DB;
|
friend class SPECCTRA_DB;
|
||||||
|
@ -2683,12 +2783,12 @@ class SESSION : public ELEM
|
||||||
HISTORY* history;
|
HISTORY* history;
|
||||||
STRUCTURE* structure;
|
STRUCTURE* structure;
|
||||||
PLACEMENT* placement;
|
PLACEMENT* placement;
|
||||||
|
WAS_IS* was_is;
|
||||||
ROUTE* route;
|
ROUTE* route;
|
||||||
|
|
||||||
/* not supported:
|
/* not supported:
|
||||||
FLOOR_PLAN* floor_plan;
|
FLOOR_PLAN* floor_plan;
|
||||||
NET_PIN_CHANGES* net_pin_changes;
|
NET_PIN_CHANGES* net_pin_changes;
|
||||||
WAS_IS* was_is;
|
|
||||||
SWAP_HISTORY* swap_history;
|
SWAP_HISTORY* swap_history;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -2700,6 +2800,7 @@ public:
|
||||||
history = 0;
|
history = 0;
|
||||||
structure = 0;
|
structure = 0;
|
||||||
placement = 0;
|
placement = 0;
|
||||||
|
was_is = 0;
|
||||||
route = 0;
|
route = 0;
|
||||||
}
|
}
|
||||||
~SESSION()
|
~SESSION()
|
||||||
|
@ -2707,6 +2808,7 @@ public:
|
||||||
delete history;
|
delete history;
|
||||||
delete structure;
|
delete structure;
|
||||||
delete placement;
|
delete placement;
|
||||||
|
delete was_is;
|
||||||
delete route;
|
delete route;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2726,6 +2828,9 @@ public:
|
||||||
|
|
||||||
if( placement )
|
if( placement )
|
||||||
placement->Format( out, nestLevel+1 );
|
placement->Format( out, nestLevel+1 );
|
||||||
|
|
||||||
|
if( was_is )
|
||||||
|
was_is->Format( out, nestLevel+1 );
|
||||||
|
|
||||||
if( route )
|
if( route )
|
||||||
route->Format( out, nestLevel+1 );
|
route->Format( out, nestLevel+1 );
|
||||||
|
@ -2886,7 +2991,8 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
|
||||||
void doSESSION( SESSION* growth ) throw( IOError );
|
void doSESSION( SESSION* growth ) throw( IOError );
|
||||||
void doANCESTOR( ANCESTOR* growth ) throw( IOError );
|
void doANCESTOR( ANCESTOR* growth ) throw( IOError );
|
||||||
void doHISTORY( HISTORY* growth ) throw( IOError );
|
void doHISTORY( HISTORY* growth ) throw( IOError );
|
||||||
void doROUTE( ROUTE* growth ) throw( IOError );
|
void doROUTE( ROUTE* growth ) throw( IOError );
|
||||||
|
void doWAS_IS( WAS_IS* growth ) throw( IOError );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -3437,6 +3543,10 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError )
|
||||||
expecting( "on|off" );
|
expecting( "on|off" );
|
||||||
growth->via_rotate_first = (tok==T_on);
|
growth->via_rotate_first = (tok==T_on);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_generated_by_freeroute:
|
||||||
|
growth->generated_by_freeroute = true;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
unexpected( lexer->CurText() );
|
unexpected( lexer->CurText() );
|
||||||
|
@ -5907,15 +6017,127 @@ void SPECCTRA_DB::doSESSION( SESSION* growth ) throw( IOError )
|
||||||
growth->placement = new PLACEMENT( growth );
|
growth->placement = new PLACEMENT( growth );
|
||||||
doPLACEMENT( growth->placement );
|
doPLACEMENT( growth->placement );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_was_is:
|
||||||
|
if( growth->was_is )
|
||||||
|
unexpected( tok );
|
||||||
|
growth->was_is = new WAS_IS( growth );
|
||||||
|
doWAS_IS( growth->was_is );
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
case T_routes:
|
||||||
case T_route:
|
|
||||||
if( growth->route )
|
if( growth->route )
|
||||||
unexpected( tok );
|
unexpected( tok );
|
||||||
growth->route = new ROUTE( growth );
|
growth->route = new ROUTE( growth );
|
||||||
doROUTE( growth->route );
|
doROUTE( growth->route );
|
||||||
break;
|
break;
|
||||||
*/
|
|
||||||
|
default:
|
||||||
|
unexpected( lexer->CurText() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SPECCTRA_DB::doWAS_IS( WAS_IS* growth ) throw( IOError )
|
||||||
|
{
|
||||||
|
DSN_T tok;
|
||||||
|
PIN_PAIR empty( growth );
|
||||||
|
PIN_PAIR* pin_pair;
|
||||||
|
|
||||||
|
/* <was_is_descriptor >::=
|
||||||
|
(was_is {(pins <pin_reference> <pin_reference> )})
|
||||||
|
*/
|
||||||
|
|
||||||
|
// none of the pins is ok too
|
||||||
|
while( (tok = nextTok()) != T_RIGHT )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( tok != T_LEFT )
|
||||||
|
expecting( T_LEFT );
|
||||||
|
|
||||||
|
tok = nextTok();
|
||||||
|
switch( tok )
|
||||||
|
{
|
||||||
|
case T_pins:
|
||||||
|
// copy the empty one, then fill its copy later thru pin_pair.
|
||||||
|
growth->pin_pairs.push_back( empty );
|
||||||
|
pin_pair= &growth->pin_pairs.back();
|
||||||
|
|
||||||
|
needSYMBOL(); // readCOMPnPIN() expects 1st token to have been read
|
||||||
|
readCOMPnPIN( &pin_pair->was.component_id, &pin_pair->was.pin_id );
|
||||||
|
|
||||||
|
needSYMBOL(); // readCOMPnPIN() expects 1st token to have been read
|
||||||
|
readCOMPnPIN( &pin_pair->is.component_id, &pin_pair->is.pin_id );
|
||||||
|
|
||||||
|
needRIGHT();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
unexpected( lexer->CurText() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SPECCTRA_DB::doROUTE( ROUTE* growth ) throw( IOError )
|
||||||
|
{
|
||||||
|
DSN_T tok;
|
||||||
|
|
||||||
|
/* <route_descriptor >::=
|
||||||
|
(routes
|
||||||
|
<resolution_descriptor>
|
||||||
|
<parser_descriptor>
|
||||||
|
<structure_out_descriptor>
|
||||||
|
<library_out_descriptor>
|
||||||
|
<network_out_descriptor>
|
||||||
|
<test_points_descriptor>
|
||||||
|
)
|
||||||
|
*/
|
||||||
|
|
||||||
|
while( (tok = nextTok()) != T_RIGHT )
|
||||||
|
{
|
||||||
|
if( tok != T_LEFT )
|
||||||
|
expecting( T_LEFT );
|
||||||
|
|
||||||
|
tok = nextTok();
|
||||||
|
switch( tok )
|
||||||
|
{
|
||||||
|
case T_resolution:
|
||||||
|
if( growth->resolution )
|
||||||
|
unexpected( tok );
|
||||||
|
growth->resolution = new UNIT_RES( growth, tok );
|
||||||
|
doRESOLUTION( growth->resolution );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_parser:
|
||||||
|
if( growth->parser )
|
||||||
|
unexpected( tok );
|
||||||
|
growth->parser = new PARSER( growth );
|
||||||
|
doPARSER( growth->parser );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_structure:
|
||||||
|
if( growth->structure )
|
||||||
|
unexpected( tok );
|
||||||
|
growth->structure = new STRUCTURE( growth );
|
||||||
|
doSTRUCTURE( growth->structure );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_library:
|
||||||
|
if( growth->library )
|
||||||
|
unexpected( tok );
|
||||||
|
growth->library = new LIBRARY( growth );
|
||||||
|
doLIBRARY( growth->library );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_network:
|
||||||
|
if( growth->network )
|
||||||
|
unexpected( tok );
|
||||||
|
growth->network = new NETWORK( growth );
|
||||||
|
doNETWORK( growth->network );
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
unexpected( lexer->CurText() );
|
unexpected( lexer->CurText() );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue