more specctra dsn work
This commit is contained in:
parent
12dfd80f37
commit
e081566706
|
@ -75,6 +75,7 @@ const static KEYWORD tokens[] = {
|
|||
TOKDEF(base_design),
|
||||
TOKDEF(bbv_ctr2ctr),
|
||||
TOKDEF(bond),
|
||||
TOKDEF(both),
|
||||
TOKDEF(bottom),
|
||||
TOKDEF(bottom_layer_sel),
|
||||
TOKDEF(boundary),
|
||||
|
@ -246,6 +247,7 @@ const static KEYWORD tokens[] = {
|
|||
TOKDEF(noexpose),
|
||||
TOKDEF(noise_accumulation),
|
||||
TOKDEF(noise_calculation),
|
||||
TOKDEF(normal),
|
||||
TOKDEF(object_type),
|
||||
TOKDEF(off),
|
||||
TOKDEF(off_grid),
|
||||
|
@ -327,8 +329,8 @@ const static KEYWORD tokens[] = {
|
|||
TOKDEF(roundoff_rotation),
|
||||
TOKDEF(route),
|
||||
TOKDEF(routes),
|
||||
TOKDEF(routes_include),
|
||||
TOKDEF(route_to_fanout_only),
|
||||
TOKDEF(routes_include),
|
||||
TOKDEF(rule),
|
||||
TOKDEF(same_net_checking),
|
||||
TOKDEF(sample_window),
|
||||
|
@ -385,8 +387,8 @@ const static KEYWORD tokens[] = {
|
|||
TOKDEF(terminator),
|
||||
TOKDEF(term_only),
|
||||
TOKDEF(test),
|
||||
TOKDEF(testpoint),
|
||||
TOKDEF(test_points),
|
||||
TOKDEF(testpoint),
|
||||
TOKDEF(threshold),
|
||||
TOKDEF(time_length_factor),
|
||||
TOKDEF(time_resolution),
|
||||
|
|
11
pcbnew/dsn.h
11
pcbnew/dsn.h
|
@ -53,8 +53,9 @@ enum DSN_T {
|
|||
T_EOF = -1, // special case for end of file
|
||||
|
||||
// from here down, this list segment should be coordinated with the
|
||||
// const static KEYWORD tokens[] array below, and must be sorted
|
||||
// alphabetically.
|
||||
// const static KEYWORD tokens[] array in dsn.cpp, and must be sorted
|
||||
// alphabetically. Remember that '_' is less than any alpha character
|
||||
// according to ASCII.
|
||||
|
||||
T_absolute, // this one should be == zero
|
||||
T_added,
|
||||
|
@ -74,6 +75,7 @@ enum DSN_T {
|
|||
T_base_design,
|
||||
T_bbv_ctr2ctr,
|
||||
T_bond,
|
||||
T_both,
|
||||
T_bottom,
|
||||
T_bottom_layer_sel,
|
||||
T_boundary,
|
||||
|
@ -245,6 +247,7 @@ enum DSN_T {
|
|||
T_noexpose,
|
||||
T_noise_accumulation,
|
||||
T_noise_calculation,
|
||||
T_normal,
|
||||
T_object_type,
|
||||
T_off,
|
||||
T_off_grid,
|
||||
|
@ -326,8 +329,8 @@ enum DSN_T {
|
|||
T_roundoff_rotation,
|
||||
T_route,
|
||||
T_routes,
|
||||
T_routes_include,
|
||||
T_route_to_fanout_only,
|
||||
T_routes_include,
|
||||
T_rule,
|
||||
T_same_net_checking,
|
||||
T_sample_window,
|
||||
|
@ -384,8 +387,8 @@ enum DSN_T {
|
|||
T_terminator,
|
||||
T_term_only,
|
||||
T_test,
|
||||
T_testpoint,
|
||||
T_test_points,
|
||||
T_testpoint,
|
||||
T_threshold,
|
||||
T_time_length_factor,
|
||||
T_time_resolution,
|
||||
|
|
|
@ -585,10 +585,8 @@ public:
|
|||
rectangle->Format( out, nestLevel+1 );
|
||||
else
|
||||
{
|
||||
for( unsigned i=0; i<paths.size(); ++i )
|
||||
{
|
||||
paths[i].Format( out, nestLevel+1 );
|
||||
}
|
||||
for( PATHS::iterator i=paths.begin(); i!=paths.end(); ++i )
|
||||
i->Format( out, nestLevel+1 );
|
||||
}
|
||||
|
||||
out->Print( nestLevel, ")\n" );
|
||||
|
@ -793,8 +791,8 @@ public:
|
|||
if( place_rules )
|
||||
place_rules->Format( out, nestLevel+1 );
|
||||
|
||||
for( unsigned i=0; i<windows.size(); ++i )
|
||||
windows[i].Format( out, nestLevel+1 );
|
||||
for( WINDOWS::iterator i=windows.begin(); i!=windows.end(); ++i )
|
||||
i->Format( out, nestLevel+1 );
|
||||
|
||||
out->Print( nestLevel, ")\n" );
|
||||
}
|
||||
|
@ -819,8 +817,7 @@ public:
|
|||
{
|
||||
out->Print( nestLevel, "(%s\n", LEXER::GetTokenText( Type() ) );
|
||||
|
||||
for( STRINGS::const_iterator i=padstacks.begin();
|
||||
i!=padstacks.end(); ++i )
|
||||
for( STRINGS::iterator i=padstacks.begin(); i!=padstacks.end(); ++i )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( i->c_str() );
|
||||
|
||||
|
@ -1088,8 +1085,8 @@ public:
|
|||
{
|
||||
out->Print( nestLevel, "(%s\n", LEXER::GetTokenText( Type() ) );
|
||||
|
||||
for( unsigned i=0; i<layer_pairs.size(); ++i )
|
||||
layer_pairs[i].Format( out, nestLevel+1 );
|
||||
for( LAYER_PAIRS::iterator i=layer_pairs.begin(); i!=layer_pairs.end(); ++i )
|
||||
i->Format( out, nestLevel+1 );
|
||||
|
||||
out->Print( nestLevel, ")\n" );
|
||||
}
|
||||
|
@ -1330,8 +1327,8 @@ public:
|
|||
if( unit )
|
||||
unit->Format( out, nestLevel );
|
||||
|
||||
for( unsigned i=0; i<layers.size(); ++i )
|
||||
layers[i].Format( out, nestLevel );
|
||||
for( LAYERS::iterator i=layers.begin(); i!=layers.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
|
||||
if( layer_noise_weight )
|
||||
layer_noise_weight->Format( out, nestLevel );
|
||||
|
@ -1342,14 +1339,14 @@ public:
|
|||
if( place_boundary )
|
||||
place_boundary->Format( out, nestLevel );
|
||||
|
||||
for( unsigned i=0; i<planes.size(); ++i )
|
||||
planes[i].Format( out, nestLevel );
|
||||
for( PLANES::iterator i=planes.begin(); i!=planes.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
|
||||
for( unsigned i=0; i<regions.size(); ++i )
|
||||
regions[i].Format( out, nestLevel );
|
||||
for( REGIONS::iterator i=regions.begin(); i!=regions.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
|
||||
for( unsigned i=0; i<keepouts.size(); ++i )
|
||||
keepouts[i].Format( out, nestLevel );
|
||||
for( KEEPOUTS::iterator i=keepouts.begin(); i!=keepouts.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
|
||||
if( via )
|
||||
via->Format( out, nestLevel );
|
||||
|
@ -1368,8 +1365,8 @@ public:
|
|||
if( place_rules )
|
||||
place_rules->Format( out, nestLevel );
|
||||
|
||||
for( unsigned i=0; i<grids.size(); ++i )
|
||||
grids[i].Format( out, nestLevel );
|
||||
for( GRIDS::iterator i=grids.begin(); i!=grids.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
}
|
||||
|
||||
DSN_T GetUnits()
|
||||
|
@ -1448,7 +1445,7 @@ public:
|
|||
void SetRotation( double aRotation )
|
||||
{
|
||||
rotation = (float) aRotation;
|
||||
isRotated = true;
|
||||
isRotated = (aRotation != 0.0);
|
||||
}
|
||||
|
||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError );
|
||||
|
@ -1477,8 +1474,8 @@ public:
|
|||
out->Print( nestLevel, "(%s %s%s%s\n", LEXER::GetTokenText( Type() ),
|
||||
quote, image_id.c_str(), quote );
|
||||
|
||||
for( unsigned i=0; i<places.size(); ++i )
|
||||
places[i].Format( out, nestLevel+1 );
|
||||
for( PLACES::iterator i=places.begin(); i!=places.end(); ++i )
|
||||
i->Format( out, nestLevel+1 );
|
||||
|
||||
out->Print( nestLevel, ")\n" );
|
||||
}
|
||||
|
@ -1520,30 +1517,10 @@ public:
|
|||
LEXER::GetTokenText( flip_style ) );
|
||||
}
|
||||
|
||||
for( unsigned i=0; i<components.size(); ++i )
|
||||
components[i].Format( out, nestLevel );
|
||||
for( COMPONENTS::iterator i=components.begin(); i!=components.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class IMAGE : public ELEM
|
||||
{
|
||||
friend class SPECCTRA_DB;
|
||||
|
||||
UNIT_RES* unit;
|
||||
|
||||
public:
|
||||
|
||||
IMAGE( ELEM* aParent ) :
|
||||
ELEM( T_image, aParent )
|
||||
{
|
||||
unit = 0;
|
||||
}
|
||||
~IMAGE()
|
||||
{
|
||||
delete unit;
|
||||
}
|
||||
|
||||
DSN_T GetUnits()
|
||||
{
|
||||
if( unit )
|
||||
|
@ -1571,8 +1548,8 @@ class SHAPE : public ELEM
|
|||
|
||||
|
||||
public:
|
||||
SHAPE( ELEM* aParent ) :
|
||||
ELEM( T_shape, aParent )
|
||||
SHAPE( ELEM* aParent, DSN_T aType = T_shape ) :
|
||||
ELEM( aType, aParent )
|
||||
{
|
||||
connect = T_on;
|
||||
|
||||
|
@ -1607,8 +1584,128 @@ public:
|
|||
if( connect == T_off )
|
||||
out->Print( nestLevel, "(connect %s)\n", LEXER::GetTokenText( connect ) );
|
||||
|
||||
for( unsigned i=0; i<windows.size(); ++i )
|
||||
windows[i].Format( out, nestLevel );
|
||||
for( WINDOWS::iterator i=windows.begin(); i!=windows.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class PIN : public ELEM
|
||||
{
|
||||
friend class SPECCTRA_DB;
|
||||
|
||||
std::string padstack_id;
|
||||
float rotation;
|
||||
bool isRotated;
|
||||
std::string pin_id;
|
||||
POINT vertex;
|
||||
|
||||
public:
|
||||
PIN( ELEM* aParent ) :
|
||||
ELEM( T_pin, aParent )
|
||||
{
|
||||
rotation = 0.0;
|
||||
isRotated = false;
|
||||
}
|
||||
|
||||
void SetRotation( double aRotation )
|
||||
{
|
||||
rotation = (float) aRotation;
|
||||
isRotated = (aRotation != 0.0);
|
||||
}
|
||||
|
||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( padstack_id.c_str() );
|
||||
if( isRotated )
|
||||
out->Print( nestLevel, "(pin %s%s%s (rotate %1.2f)",
|
||||
quote, padstack_id.c_str(), quote,
|
||||
rotation
|
||||
);
|
||||
else
|
||||
out->Print( nestLevel, "(pin %s%s%s", quote, padstack_id.c_str(), quote );
|
||||
|
||||
quote = out->GetQuoteChar( pin_id.c_str() );
|
||||
out->Print( 0, " %s%s%s %f %f)\n", quote, pin_id.c_str(), quote,
|
||||
vertex.x, vertex.y );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class IMAGE : public ELEM
|
||||
{
|
||||
friend class SPECCTRA_DB;
|
||||
|
||||
std::string image_id;
|
||||
DSN_T side;
|
||||
UNIT_RES* unit;
|
||||
|
||||
/* The grammar spec says only one outline is supported, but I am seeing
|
||||
*.dsn examples with multiple outlines. So the outlines will go into
|
||||
the kids list.
|
||||
*/
|
||||
|
||||
typedef boost::ptr_vector<PIN> PINS;
|
||||
PINS pins;
|
||||
|
||||
RULE* rules;
|
||||
RULE* place_rules;
|
||||
|
||||
public:
|
||||
|
||||
IMAGE( ELEM* aParent ) :
|
||||
ELEM( T_image, aParent )
|
||||
{
|
||||
side = T_both;
|
||||
unit = 0;
|
||||
rules = 0;
|
||||
place_rules = 0;
|
||||
}
|
||||
~IMAGE()
|
||||
{
|
||||
delete unit;
|
||||
delete rules;
|
||||
delete place_rules;
|
||||
}
|
||||
|
||||
|
||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( image_id.c_str() );
|
||||
|
||||
out->Print( nestLevel, "(%s %s%s%s", LEXER::GetTokenText( Type() ),
|
||||
quote, image_id.c_str(), quote );
|
||||
|
||||
if( side != T_both )
|
||||
out->Print( 0, " (side %s)", LEXER::GetTokenText( side ) );
|
||||
|
||||
out->Print( 0, "\n");
|
||||
|
||||
if( unit )
|
||||
unit->Format( out, nestLevel+1 );
|
||||
|
||||
// format the kids, which in this class are the shapes
|
||||
ELEM::FormatContents( out, nestLevel+1 );
|
||||
|
||||
for( PINS::iterator i=pins.begin(); i!=pins.end(); ++i )
|
||||
i->Format( out, nestLevel+1 );
|
||||
|
||||
if( rules )
|
||||
rules->Format( out, nestLevel+1 );
|
||||
|
||||
if( place_rules )
|
||||
place_rules->Format( out, nestLevel+1 );
|
||||
|
||||
out->Print( nestLevel, ")\n" );
|
||||
}
|
||||
|
||||
|
||||
DSN_T GetUnits()
|
||||
{
|
||||
if( unit )
|
||||
return unit->GetUnits();
|
||||
|
||||
return ELEM::GetUnits();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1621,10 +1718,13 @@ class PADSTACK : public ELEM
|
|||
UNIT_RES* unit;
|
||||
|
||||
/* The shapes are stored in the kids list */
|
||||
|
||||
RULE* rules;
|
||||
|
||||
DSN_T rotate;
|
||||
DSN_T absolute;
|
||||
DSN_T attach;
|
||||
std::string via_id;
|
||||
|
||||
RULE* rules;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -1632,9 +1732,10 @@ public:
|
|||
ELEM( T_padstack, aParent )
|
||||
{
|
||||
unit = 0;
|
||||
rules = 0;
|
||||
rotate = T_on;
|
||||
absolute = T_off;
|
||||
rules = 0;
|
||||
attach = T_off;
|
||||
}
|
||||
~PADSTACK()
|
||||
{
|
||||
|
@ -1654,12 +1755,27 @@ public:
|
|||
|
||||
// format the kids, which in this class are the shapes
|
||||
ELEM::FormatContents( out, nestLevel+1 );
|
||||
|
||||
if( rotate == T_off )
|
||||
out->Print( nestLevel+1, "(rotate %s)", LEXER::GetTokenText( rotate ) );
|
||||
|
||||
if( absolute == T_on )
|
||||
out->Print( nestLevel+1, "(absolute %s)", LEXER::GetTokenText( absolute ) );
|
||||
out->Print( nestLevel+1, "%s", "" );
|
||||
|
||||
// spec for <attach_descriptor> says default is on, so
|
||||
// print the off condition to override this.
|
||||
if( attach == T_off )
|
||||
out->Print( 0, "(attach off)" );
|
||||
else if( attach == T_on )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( via_id.c_str() );
|
||||
out->Print( 0, "(attach on (use_via %s%s%s))",
|
||||
quote, via_id.c_str(), quote );
|
||||
}
|
||||
|
||||
if( rotate == T_off ) // print the non-default
|
||||
out->Print( 0, "(rotate %s)", LEXER::GetTokenText( rotate ) );
|
||||
|
||||
if( absolute == T_on ) // print the non-default
|
||||
out->Print( 0, "(absolute %s)", LEXER::GetTokenText( absolute ) );
|
||||
|
||||
out->Print( 0, "\n" );
|
||||
|
||||
if( rules )
|
||||
rules->Format( out, nestLevel+1 );
|
||||
|
@ -1712,11 +1828,11 @@ public:
|
|||
if( unit )
|
||||
unit->Format( out, nestLevel );
|
||||
|
||||
for( unsigned i=0; i<images.size(); ++i )
|
||||
images[i].Format( out, nestLevel );
|
||||
for( IMAGES::iterator i=images.begin(); i!=images.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
|
||||
for( unsigned i=0; i<padstacks.size(); ++i )
|
||||
padstacks[i].Format( out, nestLevel );
|
||||
for( PADSTACKS::iterator i=padstacks.begin(); i!=padstacks.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
}
|
||||
|
||||
DSN_T GetUnits()
|
||||
|
@ -1729,6 +1845,113 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class PIN_REF : public ELEM
|
||||
{
|
||||
friend class SPECCTRA_DB;
|
||||
|
||||
std::string component_id;
|
||||
std::string pin_id;
|
||||
|
||||
public:
|
||||
|
||||
PIN_REF( ELEM* aParent ) :
|
||||
ELEM( T_pin, aParent )
|
||||
{
|
||||
}
|
||||
|
||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||
{
|
||||
out->Print( nestLevel, "\"%s\"-\"%s\"\n",
|
||||
component_id.c_str(), pin_id.c_str() );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class NET : public ELEM
|
||||
{
|
||||
friend class SPECCTRA_DB;
|
||||
|
||||
std::string net_id;
|
||||
bool unassigned;
|
||||
int net_number;
|
||||
|
||||
DSN_T pins_type; ///< T_pins | T_order
|
||||
|
||||
typedef std::vector<PIN_REF> PIN_REFS;
|
||||
PIN_REFS pins;
|
||||
|
||||
DSN_T type; ///< T_fix | T_normal
|
||||
|
||||
DSN_T supply; ///< T_power | T_ground
|
||||
|
||||
RULE* rules;
|
||||
|
||||
public:
|
||||
|
||||
NET( ELEM* aParent ) :
|
||||
ELEM( T_net, aParent )
|
||||
{
|
||||
unassigned = false;
|
||||
net_number = T_NONE;
|
||||
pins_type = T_pins;
|
||||
|
||||
type = T_NONE;
|
||||
supply = T_NONE;
|
||||
|
||||
rules = 0;
|
||||
}
|
||||
|
||||
~NET()
|
||||
{
|
||||
delete rules;
|
||||
}
|
||||
|
||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( net_id.c_str() );
|
||||
|
||||
out->Print( nestLevel, "(%s %s%s%s ", LEXER::GetTokenText( Type() ),
|
||||
quote, net_id.c_str(), quote );
|
||||
|
||||
if( unassigned )
|
||||
out->Print( 0, "(unassigned)" );
|
||||
|
||||
if( net_number != T_NONE )
|
||||
out->Print( 0, "(net_number %d)", net_number );
|
||||
|
||||
out->Print( 0, "\n" );
|
||||
|
||||
out->Print( nestLevel+1, "(%s\n", LEXER::GetTokenText( pins_type ) );
|
||||
for( PIN_REFS::iterator i=pins.begin(); i!=pins.end(); ++i )
|
||||
i->Format( out, nestLevel+2 );
|
||||
out->Print( nestLevel+1, ")\n" );
|
||||
out->Print( nestLevel, ")\n" );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class NETWORK : public ELEM
|
||||
{
|
||||
friend class SPECCTRA_DB;
|
||||
|
||||
typedef boost::ptr_vector<NET> NETS;
|
||||
NETS nets;
|
||||
|
||||
public:
|
||||
|
||||
NETWORK( ELEM* aParent ) :
|
||||
ELEM( T_network, aParent )
|
||||
{
|
||||
}
|
||||
|
||||
void FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||
{
|
||||
for( NETS::iterator i=nets.begin(); i!=nets.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class PCB : public ELEM
|
||||
{
|
||||
friend class SPECCTRA_DB;
|
||||
|
@ -1740,6 +1963,7 @@ class PCB : public ELEM
|
|||
STRUCTURE* structure;
|
||||
PLACEMENT* placement;
|
||||
LIBRARY* library;
|
||||
NETWORK* network;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -1752,6 +1976,7 @@ public:
|
|||
structure = 0;
|
||||
placement = 0;
|
||||
library = 0;
|
||||
network = 0;
|
||||
}
|
||||
|
||||
~PCB()
|
||||
|
@ -1762,6 +1987,7 @@ public:
|
|||
delete structure;
|
||||
delete placement;
|
||||
delete library;
|
||||
delete network;
|
||||
}
|
||||
|
||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||
|
@ -1788,6 +2014,9 @@ public:
|
|||
|
||||
if( library )
|
||||
library->Format( out, nestLevel+1 );
|
||||
|
||||
if( network )
|
||||
network->Format( out, nestLevel+1 );
|
||||
|
||||
out->Print( nestLevel, ")\n" );
|
||||
}
|
||||
|
@ -1879,8 +2108,11 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
|
|||
void doPROPERTIES( PROPERTIES* growth ) throw( IOError );
|
||||
void doPADSTACK( PADSTACK* growth ) throw( IOError );
|
||||
void doSHAPE( SHAPE* growth ) throw( IOError );
|
||||
void doIMAGE( IMAGE* growth ) throw( IOError );
|
||||
void doLIBRARY( LIBRARY* growth ) throw( IOError );
|
||||
|
||||
void doPIN( PIN* growth ) throw( IOError );
|
||||
void doNET( NET* growth ) throw( IOError );
|
||||
void doNETWORK( NETWORK* growth ) throw( IOError );
|
||||
|
||||
public:
|
||||
|
||||
|
@ -2087,6 +2319,13 @@ void SPECCTRA_DB::doPCB( PCB* growth ) throw( IOError )
|
|||
doLIBRARY( growth->library );
|
||||
break;
|
||||
|
||||
case T_network:
|
||||
if( growth->network )
|
||||
unexpected( tok );
|
||||
growth->network = new NETWORK( growth );
|
||||
doNETWORK( growth->network );
|
||||
break;
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
}
|
||||
|
@ -3550,6 +3789,20 @@ void SPECCTRA_DB::doPLACEMENT( PLACEMENT* growth ) throw( IOError )
|
|||
void SPECCTRA_DB::doPADSTACK( PADSTACK* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok = nextTok();
|
||||
|
||||
/* (padstack <padstack_id >
|
||||
[<unit_descriptor> ]
|
||||
{(shape <shape_descriptor>
|
||||
[<reduced_shape_descriptor> ]
|
||||
[(connect [on | off])]
|
||||
[{<window_descriptor> }]
|
||||
)}
|
||||
[<attach_descriptor> ]
|
||||
[{<pad_via_site_descriptor> }]
|
||||
[(rotate [on | off])]
|
||||
[(absolute [on | off])]
|
||||
[(rule <clearance_descriptor> )])
|
||||
*/
|
||||
|
||||
if( !isSymbol( tok ) )
|
||||
expecting( "padstack_id" );
|
||||
|
@ -3595,6 +3848,39 @@ void SPECCTRA_DB::doPADSTACK( PADSTACK* growth ) throw( IOError )
|
|||
growth->Append( shape );
|
||||
doSHAPE( shape );
|
||||
break;
|
||||
|
||||
case T_attach:
|
||||
tok = nextTok();
|
||||
if( tok!=T_off && tok!=T_on )
|
||||
expecting( "off|on" );
|
||||
growth->attach = tok;
|
||||
tok = nextTok();
|
||||
if( tok == T_LEFT )
|
||||
{
|
||||
if( nextTok() != T_use_via )
|
||||
expecting( T_use_via );
|
||||
|
||||
tok = nextTok();
|
||||
if( !isSymbol( tok ) )
|
||||
expecting( T_SYMBOL );
|
||||
growth->via_id = lexer->CurText();
|
||||
|
||||
if( nextTok()!=T_RIGHT || nextTok()!=T_RIGHT )
|
||||
expecting( T_RIGHT );
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
case T_via_site: not supported
|
||||
break;
|
||||
*/
|
||||
|
||||
case T_rule:
|
||||
if( growth->rules )
|
||||
unexpected( tok );
|
||||
growth->rules = new RULE( growth, T_rule );
|
||||
doRULE( growth->rules );
|
||||
break;
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
|
@ -3606,6 +3892,12 @@ void SPECCTRA_DB::doPADSTACK( PADSTACK* growth ) throw( IOError )
|
|||
void SPECCTRA_DB::doSHAPE( SHAPE* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok;
|
||||
|
||||
/* (shape <shape_descriptor>
|
||||
[<reduced_shape_descriptor> ]
|
||||
[(connect [on | off])]
|
||||
[{<window_descriptor> }])
|
||||
*/
|
||||
|
||||
while( (tok = nextTok()) != T_RIGHT )
|
||||
{
|
||||
|
@ -3613,6 +3905,18 @@ void SPECCTRA_DB::doSHAPE( SHAPE* growth ) throw( IOError )
|
|||
expecting( T_LEFT );
|
||||
|
||||
tok = nextTok();
|
||||
switch( tok )
|
||||
{
|
||||
case T_rect:
|
||||
case T_circle:
|
||||
case T_path:
|
||||
case T_polygon:
|
||||
case T_qarc:
|
||||
if( growth->rectangle || growth->circle || growth->path || growth->qarc )
|
||||
unexpected( tok );
|
||||
default: ;
|
||||
}
|
||||
|
||||
switch( tok )
|
||||
{
|
||||
case T_rect:
|
||||
|
@ -3641,6 +3945,8 @@ void SPECCTRA_DB::doSHAPE( SHAPE* growth ) throw( IOError )
|
|||
if( tok!=T_on && tok!=T_off )
|
||||
expecting( "on|off" );
|
||||
growth->connect = tok;
|
||||
if( nextTok() != T_RIGHT )
|
||||
expecting( T_RIGHT );
|
||||
break;
|
||||
|
||||
case T_window:
|
||||
|
@ -3657,9 +3963,31 @@ void SPECCTRA_DB::doSHAPE( SHAPE* growth ) throw( IOError )
|
|||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
|
||||
void SPECCTRA_DB::doIMAGE( IMAGE* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok;
|
||||
DSN_T tok = nextTok();
|
||||
|
||||
/* <image_descriptor >::=
|
||||
(image <image_id >
|
||||
[(side [front | back | both])]
|
||||
[<unit_descriptor> ]
|
||||
[<outline_descriptor> ]
|
||||
{(pin <padstack_id > [(rotate <rotation> )]
|
||||
[<reference_descriptor> | <pin_array_descriptor> ]
|
||||
[<user_property_descriptor> ])}
|
||||
[{<conductor_shape_descriptor> }]
|
||||
[{<conductor_via_descriptor> }]
|
||||
[<rule_descriptor> ]
|
||||
[<place_rule_descriptor> ]
|
||||
[{<keepout_descriptor> }]
|
||||
[<image_property_descriptor> ]
|
||||
)
|
||||
*/
|
||||
|
||||
if( !isSymbol( tok ) )
|
||||
expecting( "image_id" );
|
||||
|
||||
growth->image_id = lexer->CurText();
|
||||
|
||||
while( (tok = nextTok()) != T_RIGHT )
|
||||
{
|
||||
|
@ -3670,6 +3998,132 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
|
|||
switch( tok )
|
||||
{
|
||||
case T_unit:
|
||||
if( growth->unit )
|
||||
unexpected( tok );
|
||||
growth->unit = new UNIT_RES( growth, tok );
|
||||
doUNIT( growth->unit );
|
||||
break;
|
||||
|
||||
case T_side:
|
||||
tok = nextTok();
|
||||
if( tok!=T_front && tok!=T_back && tok!=T_both )
|
||||
expecting( "front|back|both" );
|
||||
growth->side = tok;
|
||||
if( nextTok() != T_RIGHT )
|
||||
expecting( T_RIGHT );
|
||||
break;
|
||||
|
||||
case T_outline:
|
||||
SHAPE* outline;
|
||||
outline = new SHAPE( growth, T_outline ); // use SHAPE for T_outline
|
||||
growth->Append( outline );
|
||||
doSHAPE( outline );
|
||||
break;
|
||||
|
||||
case T_pin:
|
||||
PIN* pin;
|
||||
pin = new PIN( growth );
|
||||
growth->pins.push_back( pin );
|
||||
doPIN( pin );
|
||||
break;
|
||||
|
||||
case T_rule:
|
||||
if( growth->rules )
|
||||
unexpected( tok );
|
||||
growth->rules = new RULE( growth, tok );
|
||||
doRULE( growth->rules );
|
||||
break;
|
||||
|
||||
case T_place_rule:
|
||||
if( growth->place_rules )
|
||||
unexpected( tok );
|
||||
growth->place_rules = new RULE( growth, tok );
|
||||
doRULE( growth->place_rules );
|
||||
break;
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok = nextTok();
|
||||
|
||||
/* (pin <padstack_id > [(rotate <rotation> )]
|
||||
[<reference_descriptor> | <pin_array_descriptor> ]
|
||||
[<user_property_descriptor> ])
|
||||
*/
|
||||
|
||||
if( !isSymbol( tok ) )
|
||||
expecting( "padstack_id" );
|
||||
|
||||
growth->padstack_id = lexer->CurText();
|
||||
|
||||
tok = nextTok();
|
||||
if( tok == T_LEFT )
|
||||
{
|
||||
tok = nextTok();
|
||||
if( tok != T_rotate )
|
||||
expecting( T_rotate );
|
||||
|
||||
if( nextTok() != T_NUMBER )
|
||||
expecting( T_NUMBER );
|
||||
growth->SetRotation( strtod( lexer->CurText(), 0 ) );
|
||||
if( nextTok() != T_RIGHT )
|
||||
expecting( T_RIGHT );
|
||||
tok = nextTok();
|
||||
}
|
||||
|
||||
if( !isSymbol(tok) && tok!=T_NUMBER )
|
||||
expecting( "pin_id" );
|
||||
|
||||
growth->pin_id = lexer->CurText();
|
||||
|
||||
if( nextTok() != T_NUMBER )
|
||||
expecting( T_NUMBER );
|
||||
growth->vertex.x = strtod( lexer->CurText(), 0 );
|
||||
|
||||
if( nextTok() != T_NUMBER )
|
||||
expecting( T_NUMBER );
|
||||
growth->vertex.x = strtod( lexer->CurText(), 0 );
|
||||
|
||||
if( nextTok() != T_RIGHT )
|
||||
unexpected( lexer->CurText() );
|
||||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok;
|
||||
|
||||
/* <library_descriptor >::=
|
||||
(library
|
||||
[<unit_descriptor> ]
|
||||
{<image_descriptor> }
|
||||
[{<jumper_descriptor> }]
|
||||
{<padstack_descriptor> }
|
||||
{<via_array_template_descriptor> }
|
||||
[<directory_descriptor> ]
|
||||
[<extra_image_directory_descriptor> ]
|
||||
[{<family_family_descriptor> }]
|
||||
[{<image_image_descriptor> }]
|
||||
)
|
||||
*/
|
||||
|
||||
while( (tok = nextTok()) != T_RIGHT )
|
||||
{
|
||||
if( tok != T_LEFT )
|
||||
expecting( T_LEFT );
|
||||
|
||||
tok = nextTok();
|
||||
switch( tok )
|
||||
{
|
||||
case T_unit:
|
||||
if( growth->unit )
|
||||
unexpected( tok );
|
||||
growth->unit = new UNIT_RES( growth, tok );
|
||||
doUNIT( growth->unit );
|
||||
break;
|
||||
|
@ -3681,10 +4135,12 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
|
|||
doPADSTACK( padstack );
|
||||
break;
|
||||
|
||||
/* @todo
|
||||
case T_image:
|
||||
IMAGE* image;
|
||||
image = new IMAGE( growth );
|
||||
growth->images.push_back( image );
|
||||
doIMAGE( image );
|
||||
break;
|
||||
*/
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
|
@ -3693,6 +4149,141 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
|
|||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::doNET( NET* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok = nextTok();
|
||||
|
||||
/* <net_descriptor >::=
|
||||
(net <net_id >
|
||||
[(unassigned)]
|
||||
[(net_number <integer >)]
|
||||
[(pins {<pin_reference> }) | (order {<pin_reference> })]
|
||||
[<component_order_descriptor> ]
|
||||
[(type [fix | normal])]
|
||||
[<user_property_descriptor> ]
|
||||
[<circuit_descriptor> ]
|
||||
[<rule_descriptor> ]
|
||||
[{<layer_rule_descriptor> }]
|
||||
[<fromto_descriptor> ]
|
||||
[(expose {<pin_reference> })]
|
||||
[(noexpose {<pin_reference> })]
|
||||
[(source {<pin_reference> })]
|
||||
[(load {<pin_reference> })]
|
||||
[(terminator {<pin_reference> })]
|
||||
[(supply [power | ground])]
|
||||
)
|
||||
*/
|
||||
|
||||
if( !isSymbol( tok ) )
|
||||
expecting( "net_id" );
|
||||
|
||||
growth->net_id = lexer->CurText();
|
||||
|
||||
while( (tok = nextTok()) != T_RIGHT )
|
||||
{
|
||||
if( tok != T_LEFT )
|
||||
expecting( T_LEFT );
|
||||
|
||||
tok = nextTok();
|
||||
switch( tok )
|
||||
{
|
||||
case T_unassigned:
|
||||
growth->unassigned = true;
|
||||
if( nextTok() != T_RIGHT )
|
||||
expecting( T_RIGHT );
|
||||
break;
|
||||
|
||||
case T_net_number:
|
||||
if( nextTok() != T_NUMBER )
|
||||
expecting( T_NUMBER );
|
||||
growth->net_number = atoi( lexer->CurText() );
|
||||
if( nextTok() != T_NUMBER )
|
||||
expecting( T_NUMBER );
|
||||
break;
|
||||
|
||||
case T_type:
|
||||
tok = nextTok();
|
||||
if( tok!=T_fix && tok!=T_normal )
|
||||
expecting( "fix|normal" );
|
||||
growth->type = tok;
|
||||
if( nextTok() != T_RIGHT )
|
||||
expecting( T_RIGHT );
|
||||
break;
|
||||
|
||||
case T_pins:
|
||||
case T_order:
|
||||
growth->pins_type = tok;
|
||||
{
|
||||
PIN_REF empty( growth );
|
||||
while( (tok = nextTok()) != T_RIGHT )
|
||||
{
|
||||
PIN_REF* pin_ref;
|
||||
|
||||
// copy the empty one, then fill its copy later thru pin_ref.
|
||||
growth->pins.push_back( empty );
|
||||
|
||||
pin_ref = &growth->pins.back();
|
||||
|
||||
if( !isSymbol(tok) )
|
||||
expecting("component_id");
|
||||
pin_ref->component_id = lexer->CurText();
|
||||
|
||||
if( nextTok() != T_DASH )
|
||||
expecting( T_DASH );
|
||||
tok = nextTok();
|
||||
|
||||
if( !isSymbol(tok) )
|
||||
expecting("component_id");
|
||||
pin_ref->pin_id = lexer->CurText();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::doNETWORK( NETWORK* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok;
|
||||
|
||||
/* <network_descriptor >::=
|
||||
(network
|
||||
{<net_descriptor>}
|
||||
[{<class_descriptor> }]
|
||||
[{<class_class_descriptor> }]
|
||||
[{<group_descriptor> }]
|
||||
[{<group_set_descriptor> }]
|
||||
[{<pair_descriptor> }]
|
||||
[{<bundle_descriptor> }]
|
||||
)
|
||||
*/
|
||||
|
||||
while( (tok = nextTok()) != T_RIGHT )
|
||||
{
|
||||
if( tok != T_LEFT )
|
||||
expecting( T_LEFT );
|
||||
|
||||
tok = nextTok();
|
||||
switch( tok )
|
||||
{
|
||||
case T_net:
|
||||
NET* net;
|
||||
net = new NET( growth );
|
||||
growth->nets.push_back( net );
|
||||
doNET( net );
|
||||
break;
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::Print( int nestLevel, const char* fmt, ... ) throw( IOError )
|
||||
{
|
||||
va_list args;
|
||||
|
|
Loading…
Reference in New Issue