Commit da3f4430 authored by dickelbeck's avatar dickelbeck

more specctra dsn work

parent b2e11dc9
...@@ -155,6 +155,7 @@ const static KEYWORD tokens[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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 ...@@ -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 ...@@ -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 &lt;was_is_descriptor&gt; 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 &lt;session_file_descriptor&gt; 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 ...@@ -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: ...@@ -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: ...@@ -2707,6 +2808,7 @@ public:
delete history; delete history;
delete structure; delete structure;
delete placement; delete placement;
delete was_is;
delete route; delete route;
} }
...@@ -2727,6 +2829,9 @@ public: ...@@ -2727,6 +2829,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 );
...@@ -2887,6 +2992,7 @@ class SPECCTRA_DB : public OUTPUTFORMATTER ...@@ -2887,6 +2992,7 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
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:
...@@ -3438,6 +3544,10 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError ) ...@@ -3438,6 +3544,10 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError )
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() );
} }
...@@ -5908,14 +6018,126 @@ void SPECCTRA_DB::doSESSION( SESSION* growth ) throw( IOError ) ...@@ -5908,14 +6018,126 @@ void SPECCTRA_DB::doSESSION( SESSION* growth ) throw( IOError )
doPLACEMENT( growth->placement ); doPLACEMENT( growth->placement );
break; break;
/* case T_was_is:
case T_route: if( growth->was_is )
unexpected( tok );
growth->was_is = new WAS_IS( growth );
doWAS_IS( growth->was_is );
break;
case T_routes:
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() );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment