more specctra dsn work
This commit is contained in:
parent
76344d43b1
commit
b8f048b55e
|
@ -2340,8 +2340,90 @@ typedef boost::ptr_vector<WIRE> WIRES;
|
|||
*/
|
||||
class WIRE_VIA : public ELEM
|
||||
{
|
||||
// @todo
|
||||
friend class SPECCTRA_DB;
|
||||
|
||||
std::string padstack_id;
|
||||
POINTS vertexes;
|
||||
std::string net_id;
|
||||
int via_number;
|
||||
DSN_T type;
|
||||
DSN_T attr;
|
||||
std::string virtual_pin_name;
|
||||
STRINGS contact_layers;
|
||||
bool supply;
|
||||
|
||||
public:
|
||||
WIRE_VIA( ELEM* aParent ) :
|
||||
ELEM( T_via, aParent )
|
||||
{
|
||||
via_number = -1;
|
||||
type = T_NONE;
|
||||
attr = T_NONE;
|
||||
supply = false;
|
||||
}
|
||||
|
||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( padstack_id.c_str() );
|
||||
out->Print( nestLevel, "(%s %s%s%s", LEXER::GetTokenText( Type() ),
|
||||
quote, padstack_id.c_str(), quote );
|
||||
|
||||
const int RIGHTMARGIN = 80;
|
||||
int perLine=RIGHTMARGIN;
|
||||
for( POINTS::iterator i=vertexes.begin(); i!=vertexes.end(); ++i )
|
||||
{
|
||||
if( perLine >= RIGHTMARGIN )
|
||||
{
|
||||
out->Print( 0, "\n" );
|
||||
perLine = 0;
|
||||
perLine += out->Print( nestLevel+1, "%f %f", i->x, i->y );
|
||||
}
|
||||
else
|
||||
{
|
||||
perLine += out->Print( 0, " %f %f", i->x, i->y );
|
||||
}
|
||||
}
|
||||
out->Print( 0, "\n" );
|
||||
|
||||
if( net_id.size() )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( net_id.c_str() );
|
||||
out->Print( nestLevel+1, "(net %s%s%s)\n", quote, net_id.c_str(), quote );
|
||||
}
|
||||
|
||||
if( type != T_NONE )
|
||||
out->Print( nestLevel+1, "(type %s)\n", LEXER::GetTokenText( type ) );
|
||||
|
||||
if( attr != T_NONE )
|
||||
{
|
||||
if( attr == T_virtual_pin )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( virtual_pin_name.c_str() );
|
||||
out->Print( nestLevel+1, "(attr virtual_pin %s%s%s)\n",
|
||||
quote, virtual_pin_name.c_str(), quote );
|
||||
}
|
||||
else
|
||||
out->Print( nestLevel+1, "(attr %s)\n", LEXER::GetTokenText( attr ) );
|
||||
}
|
||||
|
||||
if( contact_layers.size() )
|
||||
{
|
||||
out->Print( nestLevel+1, "(contact\n" );
|
||||
for( STRINGS::iterator i=contact_layers.begin(); i!=contact_layers.end(); ++i )
|
||||
{
|
||||
const char* quote = out->GetQuoteChar( i->c_str() );
|
||||
out->Print( nestLevel+2, "%s%s%s\n", quote, i->c_str(), quote );
|
||||
}
|
||||
out->Print( nestLevel+1, ")\n" );
|
||||
}
|
||||
|
||||
if( supply )
|
||||
out->Print( nestLevel+1, "(supply)\n" );
|
||||
|
||||
out->Print( nestLevel, ")\n" );
|
||||
}
|
||||
};
|
||||
typedef boost::ptr_vector<WIRE_VIA> WIRE_VIAS;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -2354,6 +2436,7 @@ class WIRING : public ELEM
|
|||
|
||||
UNIT_RES* unit;
|
||||
WIRES wires;
|
||||
WIRE_VIAS wire_vias;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -2374,6 +2457,9 @@ public:
|
|||
|
||||
for( WIRES::iterator i=wires.begin(); i!=wires.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
|
||||
for( WIRE_VIAS::iterator i=wire_vias.begin(); i!=wire_vias.end(); ++i )
|
||||
i->Format( out, nestLevel );
|
||||
}
|
||||
|
||||
DSN_T GetUnits()
|
||||
|
@ -2534,7 +2620,7 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
|
|||
* Function readCOMPnPIN
|
||||
* reads a <pin_reference> and splits it into the two parts which are
|
||||
* on either side of the hyphen. This function is specialized because
|
||||
* pin_reference may or may not double quotes involved. Both of these
|
||||
* pin_reference may or may not be using double quotes. Both of these
|
||||
* are legal: U2-14 or "U2"-"14". The lexer treats the first one as a
|
||||
* single T_SYMBOL, so in that case we have to split it into two here.
|
||||
* <p>
|
||||
|
@ -2600,6 +2686,7 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
|
|||
void doFROMTO( FROMTO* growth ) throw( IOError );
|
||||
void doCOMP_ORDER( COMP_ORDER* growth ) throw( IOError );
|
||||
void doWIRE( WIRE* growth ) throw( IOError );
|
||||
void doWIRE_VIA( WIRE_VIA* growth ) throw( IOError );
|
||||
void doWIRING( WIRING* growth ) throw( IOError );
|
||||
|
||||
public:
|
||||
|
@ -5191,6 +5278,110 @@ void SPECCTRA_DB::doWIRE( WIRE* growth ) throw( IOError )
|
|||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::doWIRE_VIA( WIRE_VIA* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok;
|
||||
POINT point;
|
||||
|
||||
/* <wire_via_descriptor >::=
|
||||
(via
|
||||
<padstack_id > {<vertex> }
|
||||
[(net <net_id >)]
|
||||
[(via_number <via#> )]
|
||||
[(type [fix | route | normal | protect])]
|
||||
[(attr [test | fanout | jumper |
|
||||
virtual_pin <virtual_pin_name> ])]
|
||||
[(contact {<layer_id >})]
|
||||
[(supply)]
|
||||
)
|
||||
(virtual_pin
|
||||
<virtual_pin_name> <vertex> (net <net_id >)
|
||||
)
|
||||
*/
|
||||
|
||||
needSYMBOL();
|
||||
growth->padstack_id = lexer->CurText();
|
||||
|
||||
while( (tok = nextTok()) == T_NUMBER )
|
||||
{
|
||||
point.x = strtod( lexer->CurText(), 0 );
|
||||
|
||||
if( nextTok() != T_NUMBER )
|
||||
expecting( "vertex.y" );
|
||||
|
||||
point.y = strtod( lexer->CurText(), 0 );
|
||||
|
||||
growth->vertexes.push_back( point );
|
||||
}
|
||||
|
||||
while( tok != T_RIGHT )
|
||||
{
|
||||
if( tok != T_LEFT )
|
||||
expecting( T_LEFT );
|
||||
|
||||
tok = nextTok();
|
||||
switch( tok )
|
||||
{
|
||||
case T_net:
|
||||
needSYMBOL();
|
||||
growth->net_id = lexer->CurText();
|
||||
needRIGHT();
|
||||
break;
|
||||
|
||||
case T_via_number:
|
||||
if( nextTok() != T_NUMBER )
|
||||
expecting( "<via#>" );
|
||||
growth->via_number = atoi( lexer->CurText() );
|
||||
needRIGHT();
|
||||
break;
|
||||
|
||||
case T_type:
|
||||
tok = nextTok();
|
||||
if( tok!=T_fix && tok!=T_route && tok!=T_normal && tok!=T_protect )
|
||||
expecting( "fix|route|normal|protect" );
|
||||
growth->type = tok;
|
||||
needRIGHT();
|
||||
break;
|
||||
|
||||
case T_attr:
|
||||
tok = nextTok();
|
||||
if( tok!=T_test && tok!=T_fanout && tok!=T_jumper && tok!=T_virtual_pin )
|
||||
expecting( "test|fanout|jumper|virtual_pin" );
|
||||
growth->attr = tok;
|
||||
if( tok == T_virtual_pin )
|
||||
{
|
||||
needSYMBOL();
|
||||
growth->virtual_pin_name = lexer->CurText();
|
||||
}
|
||||
needRIGHT();
|
||||
break;
|
||||
|
||||
case T_contact:
|
||||
needSYMBOL();
|
||||
tok = T_SYMBOL;
|
||||
while( isSymbol(tok) )
|
||||
{
|
||||
growth->contact_layers.push_back( lexer->CurText() );
|
||||
tok = nextTok();
|
||||
}
|
||||
if( tok != T_RIGHT )
|
||||
expecting( T_RIGHT );
|
||||
break;
|
||||
|
||||
case T_supply:
|
||||
growth->supply = true;
|
||||
needRIGHT();
|
||||
break;
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
}
|
||||
|
||||
tok = nextTok();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SPECCTRA_DB::doWIRING( WIRING* growth ) throw( IOError )
|
||||
{
|
||||
DSN_T tok;
|
||||
|
@ -5219,6 +5410,13 @@ void SPECCTRA_DB::doWIRING( WIRING* growth ) throw( IOError )
|
|||
doWIRE( wire );
|
||||
break;
|
||||
|
||||
case T_via:
|
||||
WIRE_VIA* wire_via;
|
||||
wire_via = new WIRE_VIA( growth );
|
||||
growth->wire_vias.push_back( wire_via );
|
||||
doWIRE_VIA( wire_via );
|
||||
break;
|
||||
|
||||
default:
|
||||
unexpected( lexer->CurText() );
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue