Commit 709be495 authored by dickelbeck's avatar dickelbeck

more amazing free specctra work

parent 10ded82d
...@@ -5,20 +5,29 @@ Started 2007-June-11 ...@@ -5,20 +5,29 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2008-Feb-13 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew
specctra export: now generate unique pin names from module padnames in the
case where there are non-unique pad names within a module. Tested with
Electra demo, and *.dsn files load OK in there as well as in freerouter.
Stopped using reserved layer name "signal" and instead output a full
padstack consisting of all pertinent layers for via, pads, and keepouts.
2008-Feb-12 UPDATE Tim Hanson sideskate@gmail.com 2008-Feb-12 UPDATE Tim Hanson sideskate@gmail.com
================================================================================ ================================================================================
+eeschema +eeschema
* commiting my changes to allow multiple instances of a given schematic file within a hierarchy: * commiting my changes to allow multiple instances of a given schematic file within a hierarchy:
** internally, m_currentScreen has been replaced with m_currentSheet, ** internally, m_currentScreen has been replaced with m_currentSheet,
which is a list or 'path' of screens. The path of screens is used to generate which is a list or 'path' of screens. The path of screens is used to generate
a series of timestamps, which is converted to flat component reference via a look-up a series of timestamps, which is converted to flat component reference via a look-up
table in the schematic files. table in the schematic files.
** this means that m_currentScreen is no longer used -- use GetScreen(). ** this means that m_currentScreen is no longer used -- use GetScreen().
** GetScreen is virtual, as some of the dialogs keep around a WinEDA_BaseScreen pointer. ** GetScreen is virtual, as some of the dialogs keep around a WinEDA_BaseScreen pointer.
** all sub-sheets in a given schematic must have different names to generate a meaningful netlist. ** all sub-sheets in a given schematic must have different names to generate a meaningful netlist.
=======
2008-Feb-12 UPDATE Igor Plyatov <plyatov@mail.ru> 2008-Feb-12 UPDATE Igor Plyatov <plyatov@mail.ru>
================================================================================ ================================================================================
+eeschema +eeschema
...@@ -26,6 +35,7 @@ email address. ...@@ -26,6 +35,7 @@ email address.
+all +all
Russian translation update. Russian translation update.
2008-Feb-11 UPDATE Dick Hollenbeck <dick@softplc.com> 2008-Feb-11 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================
+pcbnew +pcbnew
......
...@@ -27,7 +27,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const ...@@ -27,7 +27,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
wxString text, msg; wxString text, msg;
const BOARD_ITEM* item = this; const BOARD_ITEM* item = this;
EQUIPOT* net; EQUIPOT* net;
D_PAD * pad; D_PAD * pad;
switch( item->Type() ) switch( item->Type() )
{ {
...@@ -42,17 +42,17 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const ...@@ -42,17 +42,17 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
break; break;
case TYPEPAD: case TYPEPAD:
pad = (D_PAD *) this; pad = (D_PAD *) this;
text << _( "Pad" ) << wxT( " \"" ) << pad->ReturnStringPadName() text << _( "Pad" ) << wxT( " \"" ) << pad->ReturnStringPadName()
<< wxT( "\" (" ); << wxT( "\" (" );
if ( (pad->m_Masque_Layer & ALL_CU_LAYERS) == ALL_CU_LAYERS ) if ( (pad->m_Masque_Layer & ALL_CU_LAYERS) == ALL_CU_LAYERS )
text << _("all copper layers"); text << _("all copper layers");
else if( (pad->m_Masque_Layer & CUIVRE_LAYER) == CUIVRE_LAYER ) else if( (pad->m_Masque_Layer & CUIVRE_LAYER) == CUIVRE_LAYER )
text << _("copper layer"); text << _("copper layer");
else if( (pad->m_Masque_Layer & CMP_LAYER) == CMP_LAYER ) else if( (pad->m_Masque_Layer & CMP_LAYER) == CMP_LAYER )
text << _("cmp layer"); text << _("cmp layer");
else text << _("???"); else text << _("???");
text << _( ") of " ) << ( (MODULE*) GetParent() )->GetReference(); text << _( ") of " ) << ( (MODULE*) GetParent() )->GetReference();
break; break;
case TYPEDRAWSEGMENT: case TYPEDRAWSEGMENT:
...@@ -89,7 +89,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const ...@@ -89,7 +89,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
break; break;
case TYPEEDGEMODULE: case TYPEEDGEMODULE:
{ {
text << _( "Graphic" ) << wxT( " " ); text << _( "Graphic" ) << wxT( " " );
wxString cp; wxString cp;
...@@ -129,23 +129,23 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const ...@@ -129,23 +129,23 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
text << cp; text << cp;
text << wxT( " (" ) << ReturnPcbLayerName( ((EDGE_MODULE*) item )->m_Layer ).Trim() << wxT( ")" ); text << wxT( " (" ) << ReturnPcbLayerName( ((EDGE_MODULE*) item )->m_Layer ).Trim() << wxT( ")" );
text << _( " of " ) text << _( " of " )
<< ( (MODULE*) GetParent() )->GetReference(); << ( (MODULE*) GetParent() )->GetReference();
break; break;
} }
case TYPETRACK: case TYPETRACK:
// deleting tracks requires all the information we can get to // deleting tracks requires all the information we can get to
// disambiguate all the crap under the cursor! // disambiguate all the crap under the cursor!
{ {
wxString txt; wxString txt;
text << _( "Track" ) << wxT( " " ) << ((TRACK*)item)->ShowWidth(); text << _( "Track" ) << wxT( " " ) << ((TRACK*)item)->ShowWidth();
net = aPcb->FindNet( ((TRACK*)item)->GetNet() ); net = aPcb->FindNet( ((TRACK*)item)->GetNet() );
if( net ) if( net )
{ {
text << wxT( " [" ) << net->m_Netname << wxT( "]" ); text << wxT( " [" ) << net->m_Netname << wxT( "]" );
} }
text << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ).Trim() text << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ).Trim()
<< wxT(" ") << _("Net:") << ((TRACK*)item)->GetNet() << wxT(" ") << _("Net:") << ((TRACK*)item)->GetNet()
<< wxT(" ") << _("Length:") << valeur_param( (int) ((TRACK*)item)->GetLength(), txt ); << wxT(" ") << _("Length:") << valeur_param( (int) ((TRACK*)item)->GetLength(), txt );
} }
...@@ -153,36 +153,36 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const ...@@ -153,36 +153,36 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
case TYPEZONE_CONTAINER: case TYPEZONE_CONTAINER:
text = _( "Zone Outline" ); text = _( "Zone Outline" );
{ {
ZONE_CONTAINER* area = (ZONE_CONTAINER*) this; ZONE_CONTAINER* area = (ZONE_CONTAINER*) this;
int ncont = area->m_Poly->GetContour(area->m_CornerSelection); int ncont = area->m_Poly->GetContour(area->m_CornerSelection);
if ( ncont ) text << wxT(" ") << _("(Cutout)"); if ( ncont ) text << wxT(" ") << _("(Cutout)");
} }
text << wxT( " " ); text << wxT( " " );
{ {
wxString TimeStampText; wxString TimeStampText;
TimeStampText.Printf( wxT( "(%8.8X)" ), item->m_TimeStamp ); TimeStampText.Printf( wxT( "(%8.8X)" ), item->m_TimeStamp );
text << TimeStampText; text << TimeStampText;
} }
if ( ((ZONE_CONTAINER*) item)->GetNet() >= 0 ) if ( ((ZONE_CONTAINER*) item)->GetNet() >= 0 )
{ {
net = aPcb->FindNet( ( (ZONE_CONTAINER*) item )->GetNet() ); net = aPcb->FindNet( ( (ZONE_CONTAINER*) item )->GetNet() );
if( net ) if( net )
{ {
text << wxT( " [" ) << net->m_Netname << wxT( "]" ); text << wxT( " [" ) << net->m_Netname << wxT( "]" );
} }
} }
else // A netcode < 0 is an error flag (Netname not found or area not initialised) else // A netcode < 0 is an error flag (Netname not found or area not initialised)
{ {
text << wxT( " [" ) << ( (ZONE_CONTAINER*) item )->m_Netname << wxT( "]" ); text << wxT( " [" ) << ( (ZONE_CONTAINER*) item )->m_Netname << wxT( "]" );
text << wxT(" <") << _("Not Found") << wxT(">"); text << wxT(" <") << _("Not Found") << wxT(">");
} }
text << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ).Trim(); text << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ).Trim();
break; break;
case TYPEZONE: case TYPEZONE:
text = _( "Zone" ); text = _( "Zone" );
text << wxT( " " ); text << wxT( " " );
{ {
wxString TimeStampText; wxString TimeStampText;
TimeStampText.Printf( wxT( "(%8.8X)" ), item->m_TimeStamp ); TimeStampText.Printf( wxT( "(%8.8X)" ), item->m_TimeStamp );
...@@ -200,34 +200,35 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const ...@@ -200,34 +200,35 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
{ {
SEGVIA* via = (SEGVIA*) item; SEGVIA* via = (SEGVIA*) item;
text << _( "Via" ) << wxT( " " ) << via->ShowWidth(); text << _( "Via" ) << wxT( " " ) << via->ShowWidth();
int shape = via->Shape(); int shape = via->Shape();
if( shape == VIA_BLIND_BURIED ) if( shape == VIA_BLIND_BURIED )
text << wxT(" ") << _( "Blind/Buried" ); text << wxT(" ") << _( "Blind/Buried" );
else if( shape == VIA_MICROVIA ) else if( shape == VIA_MICROVIA )
text << wxT(" ") << _("Micro Via"); text << wxT(" ") << _("Micro Via");
// else say nothing about normal (through) vias // else say nothing about normal (through) vias
net = aPcb->FindNet( via->GetNet() ); net = aPcb->FindNet( via->GetNet() );
if( net ) if( net )
{ {
text << wxT( " [" ) << net->m_Netname << wxT( "]" ); text << wxT( " [" ) << net->m_Netname << wxT( "]" );
} }
text << wxChar(' ') << _("Net:") << via->GetNet();
if( shape != VIA_THROUGH ) if( shape != VIA_THROUGH )
{ {
// say which layers, only two for now // say which layers, only two for now
int topLayer; int topLayer;
int botLayer; int botLayer;
via->ReturnLayerPair( &topLayer, &botLayer ); via->ReturnLayerPair( &topLayer, &botLayer );
text << _( " on " ) << ReturnPcbLayerName( topLayer).Trim() << wxT(" <-> ") text << _( " on " ) << ReturnPcbLayerName( topLayer).Trim() << wxT(" <-> ")
<< ReturnPcbLayerName( botLayer ).Trim(); << ReturnPcbLayerName( botLayer ).Trim();
} }
} }
break; break;
case TYPEMARKER: case TYPEMARKER:
text << _( "Marker" ) << wxT( " @(" ) << ((MARKER*)item)->GetPos().x text << _( "Marker" ) << wxT( " @(" ) << ((MARKER*)item)->GetPos().x
<< wxT(",") << ((MARKER*)item)->GetPos().y << wxT(")"); << wxT(",") << ((MARKER*)item)->GetPos().y << wxT(")");
break; break;
...@@ -236,7 +237,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const ...@@ -236,7 +237,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
break; break;
case TYPEMIRE: case TYPEMIRE:
valeur_param( ((MIREPCB*)item)->m_Size, msg ); valeur_param( ((MIREPCB*)item)->m_Size, msg );
text << _( "Target" ) << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ).Trim() text << _( "Target" ) << _( " on " ) << ReturnPcbLayerName( item->GetLayer() ).Trim()
<< wxT( " " ) << _( "size" ) << wxT( " " ) << msg << wxT( " " ) << _( "size" ) << wxT( " " ) << msg
; ;
......
...@@ -76,6 +76,7 @@ namespace DSN { ...@@ -76,6 +76,7 @@ namespace DSN {
//-----<SPECCTRA_DB>------------------------------------------------- //-----<SPECCTRA_DB>-------------------------------------------------
#if !defined(STANDALONE)
void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard ) void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard )
{ {
...@@ -100,6 +101,7 @@ void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard ) ...@@ -100,6 +101,7 @@ void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard )
layerIds.push_back( CONV_TO_UTF8( aBoard->GetLayerName( kilayer ) ) ); layerIds.push_back( CONV_TO_UTF8( aBoard->GetLayerName( kilayer ) ) );
} }
} }
#endif
int SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const int SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const
...@@ -183,13 +185,21 @@ void SPECCTRA_DB::needRIGHT() throw( IOError ) ...@@ -183,13 +185,21 @@ void SPECCTRA_DB::needRIGHT() throw( IOError )
expecting( T_RIGHT ); expecting( T_RIGHT );
} }
void SPECCTRA_DB::needSYMBOL() throw( IOError ) DSN_T SPECCTRA_DB::needSYMBOL() throw( IOError )
{ {
DSN_T tok = nextTok(); DSN_T tok = nextTok();
if( !isSymbol( tok ) ) if( !isSymbol( tok ) )
expecting( T_SYMBOL ); expecting( T_SYMBOL );
return tok;
} }
DSN_T SPECCTRA_DB::needSYMBOLorNUMBER() throw( IOError )
{
DSN_T tok = nextTok();
if( !isSymbol( tok ) && tok!=T_NUMBER )
expecting( "symbol|number" );
return tok;
}
void SPECCTRA_DB::readCOMPnPIN( std::string* component_id, std::string* pin_id ) throw( IOError ) void SPECCTRA_DB::readCOMPnPIN( std::string* component_id, std::string* pin_id ) throw( IOError )
{ {
...@@ -467,7 +477,9 @@ void SPECCTRA_DB::doPCB( PCB* growth ) throw( IOError ) ...@@ -467,7 +477,9 @@ void SPECCTRA_DB::doPCB( PCB* growth ) throw( IOError )
void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError ) void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError )
{ {
DSN_T tok; DSN_T tok;
std::string const1;
std::string const2;
/* <parser_descriptor >::= /* <parser_descriptor >::=
(parser (parser
...@@ -519,17 +531,19 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError ) ...@@ -519,17 +531,19 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError )
break; break;
case T_host_version: case T_host_version:
needSYMBOL(); needSYMBOLorNUMBER();
growth->host_version = lexer->CurText(); growth->host_version = lexer->CurText();
needRIGHT(); needRIGHT();
break; break;
case T_constant: case T_constant:
needSYMBOL(); needSYMBOLorNUMBER();
growth->const_id1 = lexer->CurText(); const1 = lexer->CurText();
needSYMBOL(); needSYMBOLorNUMBER();
growth->const_id2 = lexer->CurText(); const2 = lexer->CurText();
needRIGHT(); needRIGHT();
growth->constants.push_back( const1 );
growth->constants.push_back( const2 );
break; break;
case T_write_resolution: // [(writee_resolution {<character> <positive_integer >})] case T_write_resolution: // [(writee_resolution {<character> <positive_integer >})]
...@@ -710,6 +724,8 @@ void SPECCTRA_DB::doSTRUCTURE( STRUCTURE* growth ) throw(IOError) ...@@ -710,6 +724,8 @@ void SPECCTRA_DB::doSTRUCTURE( STRUCTURE* growth ) throw(IOError)
break; break;
case T_layer_noise_weight: case T_layer_noise_weight:
if( growth->layer_noise_weight )
unexpected( tok );
growth->layer_noise_weight = new LAYER_NOISE_WEIGHT( growth ); growth->layer_noise_weight = new LAYER_NOISE_WEIGHT( growth );
doLAYER_NOISE_WEIGHT( growth->layer_noise_weight ); doLAYER_NOISE_WEIGHT( growth->layer_noise_weight );
break; break;
...@@ -755,11 +771,15 @@ L_place: ...@@ -755,11 +771,15 @@ L_place:
break; break;
case T_via: case T_via:
if( growth->via )
unexpected( tok );
growth->via = new VIA( growth ); growth->via = new VIA( growth );
doVIA( growth->via ); doVIA( growth->via );
break; break;
case T_control: case T_control:
if( growth->control )
unexpected( tok );
growth->control = new CONTROL( growth ); growth->control = new CONTROL( growth );
doCONTROL( growth->control ); doCONTROL( growth->control );
break; break;
...@@ -772,11 +792,15 @@ L_place: ...@@ -772,11 +792,15 @@ L_place:
break; break;
case T_rule: case T_rule:
if( growth->rules )
unexpected( tok );
growth->rules = new RULE( growth, T_rule ); growth->rules = new RULE( growth, T_rule );
doRULE( growth->rules ); doRULE( growth->rules );
break; break;
case T_place_rule: case T_place_rule:
if( growth->place_rules )
unexpected( tok );
growth->place_rules = new RULE( growth, T_place_rule ); growth->place_rules = new RULE( growth, T_place_rule );
doRULE( growth->place_rules ); doRULE( growth->place_rules );
break; break;
...@@ -2219,35 +2243,35 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError ) ...@@ -2219,35 +2243,35 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )
growth->padstack_id = lexer->CurText(); growth->padstack_id = lexer->CurText();
tok = nextTok(); while( (tok = nextTok()) != T_RIGHT )
if( tok == T_LEFT )
{ {
tok = nextTok(); if( tok == T_LEFT )
if( tok != T_rotate ) {
expecting( T_rotate ); tok = nextTok();
if( tok != T_rotate )
if( nextTok() != T_NUMBER ) expecting( T_rotate );
expecting( T_NUMBER );
growth->SetRotation( strtod( lexer->CurText(), 0 ) );
needRIGHT();
tok = nextTok();
}
if( !isSymbol(tok) && tok!=T_NUMBER )
expecting( "pin_id" );
growth->pin_id = lexer->CurText(); if( nextTok() != T_NUMBER )
expecting( T_NUMBER );
growth->SetRotation( strtod( lexer->CurText(), 0 ) );
needRIGHT();
}
else
{
if( !isSymbol(tok) && tok!=T_NUMBER )
expecting( "pin_id" );
if( nextTok() != T_NUMBER ) growth->pin_id = lexer->CurText();
expecting( T_NUMBER );
growth->vertex.x = strtod( lexer->CurText(), 0 );
if( nextTok() != T_NUMBER ) if( nextTok() != T_NUMBER )
expecting( T_NUMBER ); expecting( T_NUMBER );
growth->vertex.y = strtod( lexer->CurText(), 0 ); growth->vertex.x = strtod( lexer->CurText(), 0 );
if( nextTok() != T_RIGHT ) if( nextTok() != T_NUMBER )
unexpected( lexer->CurText() ); expecting( T_NUMBER );
growth->vertex.y = strtod( lexer->CurText(), 0 );
}
}
} }
...@@ -2286,8 +2310,8 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError ) ...@@ -2286,8 +2310,8 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
case T_padstack: case T_padstack:
PADSTACK* padstack; PADSTACK* padstack;
padstack = new PADSTACK( growth ); padstack = new PADSTACK();
growth->padstacks.push_back( padstack ); growth->AddPadstack( padstack );
doPADSTACK( padstack ); doPADSTACK( padstack );
break; break;
...@@ -2307,7 +2331,8 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError ) ...@@ -2307,7 +2331,8 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
void SPECCTRA_DB::doNET( NET* growth ) throw( IOError ) void SPECCTRA_DB::doNET( NET* growth ) throw( IOError )
{ {
DSN_T tok = nextTok(); DSN_T tok = nextTok();
PIN_REFS* pin_refs;
/* <net_descriptor >::= /* <net_descriptor >::=
(net <net_id > (net <net_id >
...@@ -2358,14 +2383,38 @@ void SPECCTRA_DB::doNET( NET* growth ) throw( IOError ) ...@@ -2358,14 +2383,38 @@ void SPECCTRA_DB::doNET( NET* growth ) throw( IOError )
case T_pins: case T_pins:
case T_order: case T_order:
growth->pins_type = tok; growth->pins_type = tok;
pin_refs = &growth->pins;
goto L_pins;
case T_expose:
pin_refs = &growth->expose;
goto L_pins;
case T_noexpose:
pin_refs = &growth->noexpose;
goto L_pins;
case T_source:
pin_refs = &growth->source;
goto L_pins;
case T_load:
pin_refs = &growth->load;
goto L_pins;
case T_terminator:
pin_refs = &growth->terminator;
//goto L_pins;
L_pins:
{ {
PIN_REF empty( growth ); PIN_REF empty( growth );
while( (tok = nextTok()) != T_RIGHT ) while( (tok = nextTok()) != T_RIGHT )
{ {
// copy the empty one, then fill its copy later thru pin_ref. // copy the empty one, then fill its copy later thru pin_ref.
growth->pins.push_back( empty ); pin_refs->push_back( empty );
PIN_REF* pin_ref = &growth->pins.back(); PIN_REF* pin_ref = &pin_refs->back();
readCOMPnPIN( &pin_ref->component_id, &pin_ref->pin_id ); readCOMPnPIN( &pin_ref->component_id, &pin_ref->pin_id );
} }
...@@ -3431,7 +3480,7 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote ...@@ -3431,7 +3480,7 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote
if( strlen(wrapee)==0 ) if( strlen(wrapee)==0 )
return quote_char; return quote_char;
bool isNumber = true; // bool isNumber = true;
for( ; *wrapee; ++wrapee ) for( ; *wrapee; ++wrapee )
{ {
...@@ -3444,12 +3493,12 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote ...@@ -3444,12 +3493,12 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote
if( strchr( quoteThese, *wrapee ) ) if( strchr( quoteThese, *wrapee ) )
return quote_char; return quote_char;
if( !strchr( "01234567890.-+", *wrapee ) ) // if( !strchr( "01234567890.-+", *wrapee ) )
isNumber = false; // isNumber = false;
} }
if( isNumber ) // if( isNumber )
return quote_char; // return quote_char;
return ""; // can use an unwrapped string. return ""; // can use an unwrapped string.
} }
...@@ -3670,6 +3719,11 @@ int ELEM_HOLDER::FindElem( DSN_T aType, int instanceNum ) ...@@ -3670,6 +3719,11 @@ int ELEM_HOLDER::FindElem( DSN_T aType, int instanceNum )
return -1; return -1;
} }
// a reasonably small memory price to pay for improved performance
STRINGFORMATTER ELEM::sf;
//-----<UNIT_RES>--------------------------------------------------------- //-----<UNIT_RES>---------------------------------------------------------
UNIT_RES UNIT_RES::Default( NULL, T_resolution ); UNIT_RES UNIT_RES::Default( NULL, T_resolution );
...@@ -3679,6 +3733,8 @@ UNIT_RES UNIT_RES::Default( NULL, T_resolution ); ...@@ -3679,6 +3733,8 @@ UNIT_RES UNIT_RES::Default( NULL, T_resolution );
int PADSTACK::Compare( PADSTACK* lhs, PADSTACK* rhs ) int PADSTACK::Compare( PADSTACK* lhs, PADSTACK* rhs )
{ {
// printf( "PADSTACK::Compare( %p, %p)\n", lhs, rhs );
if( !lhs->hash.size() ) if( !lhs->hash.size() )
lhs->hash = lhs->makeHash(); lhs->hash = lhs->makeHash();
...@@ -3725,7 +3781,6 @@ int COMPONENT::Compare( COMPONENT* lhs, COMPONENT* rhs ) ...@@ -3725,7 +3781,6 @@ int COMPONENT::Compare( COMPONENT* lhs, COMPONENT* rhs )
*/ */
//-----<PARSER>----------------------------------------------------------- //-----<PARSER>-----------------------------------------------------------
PARSER::PARSER( ELEM* aParent ) : PARSER::PARSER( ELEM* aParent ) :
ELEM( T_parser, aParent ) ELEM( T_parser, aParent )
{ {
...@@ -3752,10 +3807,17 @@ void PARSER::FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOErro ...@@ -3752,10 +3807,17 @@ void PARSER::FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOErro
out->Print( nestLevel, "(host_cad \"%s\")\n", host_cad.c_str() ); out->Print( nestLevel, "(host_cad \"%s\")\n", host_cad.c_str() );
out->Print( nestLevel, "(host_version \"%s\")\n", host_version.c_str() ); out->Print( nestLevel, "(host_version \"%s\")\n", host_version.c_str() );
if( const_id1.length()>0 || const_id2.length()>0 ) for( STRINGS::iterator i=constants.begin(); i!=constants.end(); )
out->Print( nestLevel, "(constant %c%s%c %c%s%c)\n", {
string_quote, const_id1.c_str(), string_quote, const std::string& s1 = *i++;
string_quote, const_id2.c_str(), string_quote ); const std::string& s2 = *i++;
const char* q1 = out->GetQuoteChar( s1.c_str() );
const char* q2 = out->GetQuoteChar( s2.c_str() );
out->Print( nestLevel, "(constant %s%s%s %s%s%s)\n",
q1, s1.c_str(), q1,
q2, s2.c_str(), q2 );
}
if( routes_include_testpoint || routes_include_guides || routes_include_image_conductor ) if( routes_include_testpoint || routes_include_guides || routes_include_image_conductor )
out->Print( nestLevel, "(routes_include%s%s%s)\n", out->Print( nestLevel, "(routes_include%s%s%s)\n",
......
...@@ -29,6 +29,10 @@ ...@@ -29,6 +29,10 @@
// see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html // see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html
#include <boost/ptr_container/ptr_vector.hpp> #include <boost/ptr_container/ptr_vector.hpp>
// see http://www.boost.org/libs/ptr_container/doc/ptr_set.html
#include <boost/ptr_container/ptr_set.hpp>
#include <boost/noncopyable.hpp>
#include "fctsys.h" #include "fctsys.h"
#include "dsn.h" #include "dsn.h"
...@@ -303,14 +307,16 @@ protected: ...@@ -303,14 +307,16 @@ protected:
*/ */
std::string makeHash() std::string makeHash()
{ {
STRINGFORMATTER sf; sf.Clear();
FormatContents( &sf, 0 ); FormatContents( &sf, 0 );
sf.StripUseless(); sf.StripUseless();
return sf.GetString(); return sf.GetString();
} }
// avoid creating this for every compare, make static.
static STRINGFORMATTER sf;
public: public:
...@@ -466,8 +472,8 @@ class PARSER : public ELEM ...@@ -466,8 +472,8 @@ class PARSER : public ELEM
bool via_rotate_first; bool via_rotate_first;
bool generated_by_freeroute; bool generated_by_freeroute;
std::string const_id1; /// This holds pairs of strings, one pair for each constant definition
std::string const_id2; STRINGS constants;
std::string host_cad; std::string host_cad;
std::string host_version; std::string host_version;
...@@ -1924,12 +1930,16 @@ class PIN : public ELEM ...@@ -1924,12 +1930,16 @@ class PIN : public ELEM
std::string pin_id; std::string pin_id;
POINT vertex; POINT vertex;
int kiNetCode; ///< kicad netcode
public: public:
PIN( ELEM* aParent ) : PIN( ELEM* aParent ) :
ELEM( T_pin, aParent ) ELEM( T_pin, aParent )
{ {
rotation = 0.0; rotation = 0.0;
isRotated = false; isRotated = false;
kiNetCode = 0;
} }
void SetRotation( double aRotation ) void SetRotation( double aRotation )
...@@ -1960,6 +1970,8 @@ public: ...@@ -1960,6 +1970,8 @@ public:
vertex.x, vertex.y ); vertex.x, vertex.y );
} }
}; };
typedef boost::ptr_vector<PIN> PINS;
class LIBRARY; class LIBRARY;
class IMAGE : public ELEM_HOLDER class IMAGE : public ELEM_HOLDER
...@@ -1978,7 +1990,6 @@ class IMAGE : public ELEM_HOLDER ...@@ -1978,7 +1990,6 @@ class IMAGE : public ELEM_HOLDER
the kids list. the kids list.
*/ */
typedef boost::ptr_vector<PIN> PINS;
PINS pins; PINS pins;
RULE* rules; RULE* rules;
...@@ -2085,7 +2096,7 @@ typedef boost::ptr_vector<IMAGE> IMAGES; ...@@ -2085,7 +2096,7 @@ typedef boost::ptr_vector<IMAGE> IMAGES;
* Class PADSTACK * Class PADSTACK
* holds either a via or a pad definition. * holds either a via or a pad definition.
*/ */
class PADSTACK : public ELEM_HOLDER class PADSTACK : public ELEM_HOLDER, private boost::noncopyable
{ {
friend class SPECCTRA_DB; friend class SPECCTRA_DB;
...@@ -2105,8 +2116,14 @@ class PADSTACK : public ELEM_HOLDER ...@@ -2105,8 +2116,14 @@ class PADSTACK : public ELEM_HOLDER
public: public:
PADSTACK( ELEM* aParent ) : /**
ELEM_HOLDER( T_padstack, aParent ) * Constructor PADSTACK()
* cannot take ELEM* aParent because PADSTACKSET confuses this with a
* copy constructor and causes havoc. Instead set parent with
* LIBRARY::AddPadstack()
*/
PADSTACK() :
ELEM_HOLDER( T_padstack, NULL )
{ {
unit = 0; unit = 0;
rotate = T_on; rotate = T_on;
...@@ -2131,6 +2148,7 @@ public: ...@@ -2131,6 +2148,7 @@ public:
*/ */
static int Compare( PADSTACK* lhs, PADSTACK* rhs ); static int Compare( PADSTACK* lhs, PADSTACK* rhs );
void SetPadstackId( const char* aPadstackId ) void SetPadstackId( const char* aPadstackId )
{ {
padstack_id = aPadstackId; padstack_id = aPadstackId;
...@@ -2194,6 +2212,15 @@ public: ...@@ -2194,6 +2212,15 @@ public:
}; };
typedef boost::ptr_vector<PADSTACK> PADSTACKS; typedef boost::ptr_vector<PADSTACK> PADSTACKS;
/**
* Function operator<()
* is used by the PADSTACKSET boost::ptr_set below
*/
inline bool operator<( const PADSTACK& lhs, const PADSTACK& rhs )
{
return PADSTACK::Compare( (PADSTACK*) &lhs, (PADSTACK*) &rhs ) < 0;
}
/** /**
* Class LIBRARY * Class LIBRARY
...@@ -2228,6 +2255,7 @@ public: ...@@ -2228,6 +2255,7 @@ public:
void AddPadstack( PADSTACK* aPadstack ) void AddPadstack( PADSTACK* aPadstack )
{ {
aPadstack->SetParent( this );
padstacks.push_back( aPadstack ); padstacks.push_back( aPadstack );
} }
...@@ -2537,10 +2565,15 @@ class NET : public ELEM ...@@ -2537,10 +2565,15 @@ class NET : public ELEM
bool unassigned; bool unassigned;
int net_number; int net_number;
DSN_T pins_type; ///< T_pins | T_order DSN_T pins_type; ///< T_pins | T_order, type of field 'pins' below
PIN_REFS pins; PIN_REFS pins;
PIN_REFS expose;
PIN_REFS noexpose;
PIN_REFS source;
PIN_REFS load;
PIN_REFS terminator;
DSN_T type; ///< T_fix | T_normal DSN_T type; ///< T_fix | T_normal
DSN_T supply; ///< T_power | T_ground DSN_T supply; ///< T_power | T_ground
...@@ -3525,6 +3558,9 @@ public: ...@@ -3525,6 +3558,9 @@ public:
}; };
typedef boost::ptr_set<PADSTACK> PADSTACKSET;
/** /**
* Class SPECCTRA_DB * Class SPECCTRA_DB
* holds a DSN data tree, usually coming from a DSN file. * holds a DSN data tree, usually coming from a DSN file.
...@@ -3561,6 +3597,12 @@ class SPECCTRA_DB : public OUTPUTFORMATTER ...@@ -3561,6 +3597,12 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
static const KICAD_T scanPADs[]; static const KICAD_T scanPADs[];
PADSTACKSET padstackset;
/// we don't want ownership here permanently, so we don't use boost::ptr_vector
std::vector<NET*> nets;
/** /**
* Function buildLayerMaps * Function buildLayerMaps
* creates a few data translation structures for layer name and number * creates a few data translation structures for layer name and number
...@@ -3612,9 +3654,20 @@ class SPECCTRA_DB : public OUTPUTFORMATTER ...@@ -3612,9 +3654,20 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
* calls nextTok() and then verifies that the token read in * calls nextTok() and then verifies that the token read in
* satisfies bool isSymbol(). * satisfies bool isSymbol().
* If not, an IOError is thrown. * If not, an IOError is thrown.
* @return DSN_T - the actual token read in.
* @throw IOError, if the next token does not satisfy isSymbol() * @throw IOError, if the next token does not satisfy isSymbol()
*/ */
void needSYMBOL() throw( IOError ); DSN_T needSYMBOL() throw( IOError );
/**
* Function needSYMBOLorNUMBER
* calls nextTok() and then verifies that the token read in
* satisfies bool isSymbol() or tok==T_NUMBER.
* If not, an IOError is thrown.
* @return DSN_T - the actual token read in.
* @throw IOError, if the next token does not satisfy the above test
*/
DSN_T needSYMBOLorNUMBER() throw( IOError );
/** /**
* Function readCOMPnPIN * Function readCOMPnPIN
...@@ -3718,28 +3771,35 @@ class SPECCTRA_DB : public OUTPUTFORMATTER ...@@ -3718,28 +3771,35 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
/** /**
* Function makeIMAGE * Function makeIMAGE
* allocates an IMAGE on the heap and creates all the PINs according * allocates an IMAGE on the heap and creates all the PINs according
* to the PADs in the MODULE. * to the D_PADs in the MODULE.
* @param aBoard The owner of the MODULE.
* @param aModule The MODULE from which to build the IMAGE.
* @return IMAGE* - not tested for duplication yet.
*/ */
IMAGE* makeIMAGE( MODULE* aModule ); IMAGE* makeIMAGE( BOARD* aBoard, MODULE* aModule );
/** /**
* Function makePADSTACKs * Function makePADSTACK
* makes all the PADSTACKs, and marks each D_PAD with the index into the * creates a PADSTACK which matches the given pad. Only pads which do not
* LIBRARY::padstacks list that it matches. * satisfy the function isKeepout() should be passed to this function.
* @param aPad The D_PAD which needs to be made into a PADSTACK.
* @return PADSTACK* - The created padstack, including its padstack_id.
*/ */
void makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads ); PADSTACK* makePADSTACK( BOARD* aBoard, D_PAD* aPad );
/** /**
* Function makeVia * Function makeVia
* makes a round through hole PADSTACK using the given Kicad diameter in deci-mils. * makes a round through hole PADSTACK using the given Kicad diameter in deci-mils.
* @param aCopperDiameter The diameter of the copper pad. * @param aCopperDiameter The diameter of the copper pad.
* @param aDrillDiameter The drill diameter, used on re-import of the session file. * @param aDrillDiameter The drill diameter, used on re-import of the session file.
* @param aTopLayer The DSN::PCB top most layer index.
* @param aBotLayer The DSN::PCB bottom most layer index.
* @return PADSTACK* - The padstack, which is on the heap only, user must save * @return PADSTACK* - The padstack, which is on the heap only, user must save
* or delete it. * or delete it.
*/ */
PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter ); PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter,
int aTopLayer, int aBotLayer );
/** /**
* Function makeVia * Function makeVia
...@@ -3751,6 +3811,19 @@ class SPECCTRA_DB : public OUTPUTFORMATTER ...@@ -3751,6 +3811,19 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
PADSTACK* makeVia( const SEGVIA* aVia ); PADSTACK* makeVia( const SEGVIA* aVia );
/**
* Function deleteNETs
* deletes all the NETs that may be in here.
*/
void deleteNETs()
{
for( unsigned n=0; n<nets.size(); ++n )
delete nets[n];
nets.clear();
}
//-----<FromSESSION>----------------------------------------------------- //-----<FromSESSION>-----------------------------------------------------
/** /**
...@@ -3786,6 +3859,8 @@ public: ...@@ -3786,6 +3859,8 @@ public:
delete pcb; delete pcb;
delete session; delete session;
deleteNETs();
if( fp ) if( fp )
fclose( fp ); fclose( fp );
} }
......
This diff is collapsed.
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