XNODE* NETLIST_EXPORTER_GENERIC::makeListOfNets() { XNODE* xnets = node( wxT( "nets" ) ); // auto_ptr if exceptions ever get used. wxString netCodeTxt; wxString netName; wxString ref; wxString sNet = wxT( "net" ); wxString sName = wxT( "name" ); wxString sCode = wxT( "code" ); wxString sRef = wxT( "ref" ); wxString sPin = wxT( "pin" ); wxString sNode = wxT( "node" ); wxString sFmtd = wxT( "%d" ); XNODE* xnet = 0; int netCode; int lastNetCode = -1; int sameNetcodeCount = 0; /* output: <net code="123" name="/cfcard.sch/WAIT#"> <node ref="R23" pin="1"/> <node ref="U18" pin="12"/> </net> */ m_LibParts.clear(); // must call this function before using m_LibParts. for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) { NETLIST_OBJECT* nitem = m_masterList->GetItem( ii ); SCH_COMPONENT* comp; // New net found, write net id; if( ( netCode = nitem->GetNet() ) != lastNetCode ) { sameNetcodeCount = 0; // item count for this net netName = nitem->GetNetName(); lastNetCode = netCode; } if( nitem->m_Type != NET_PIN ) continue; if( nitem->m_Flag != 0 ) // Redundant pin, skip it continue; comp = nitem->GetComponentParent(); // Get the reference for the net name and the main parent component ref = comp->GetRef( &nitem->m_SheetPath ); if( ref[0] == wxChar( '#' ) ) continue; if( ++sameNetcodeCount == 1 ) { xnets->AddChild( xnet = node( sNet ) ); netCodeTxt.Printf( sFmtd, netCode ); xnet->AddAttribute( sCode, netCodeTxt ); xnet->AddAttribute( sName, netName ); } XNODE* xnode; xnet->AddChild( xnode = node( sNode ) ); xnode->AddAttribute( sRef, ref ); xnode->AddAttribute( sPin, nitem->GetPinNumText() ); } return xnets; }
bool NETLIST_EXPORTER_PSPICE::ProcessNetlist( unsigned aCtl ) { const wxString delimiters( "{:,; }" ); SCH_SHEET_LIST sheetList( g_RootSheet ); // Set of reference names, to check for duplications std::set<wxString> refNames; // Prepare list of nets generation (not used here, but... for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) m_masterList->GetItem( ii )->m_Flag = 0; m_netMap.clear(); m_netMap["GND"] = 0; // 0 is reserved for "GND" int netIdx = 1; m_libraries.clear(); m_ReferencesAlreadyFound.Clear(); UpdateDirectives( aCtl ); for( unsigned sheet_idx = 0; sheet_idx < sheetList.size(); sheet_idx++ ) { // Process component attributes to find Spice directives for( EDA_ITEM* item = sheetList[sheet_idx].LastDrawList(); item; item = item->Next() ) { SCH_COMPONENT* comp = findNextComponentAndCreatePinList( item, &sheetList[sheet_idx] ); if( !comp ) break; item = comp; SPICE_ITEM spiceItem; spiceItem.m_parent = comp; // Obtain Spice fields SCH_FIELD* fieldLibFile = comp->FindField( GetSpiceFieldName( SF_LIB_FILE ) ); SCH_FIELD* fieldSeq = comp->FindField( GetSpiceFieldName( SF_NODE_SEQUENCE ) ); spiceItem.m_primitive = GetSpiceField( SF_PRIMITIVE, comp, aCtl )[0]; spiceItem.m_model = GetSpiceField( SF_MODEL, comp, aCtl ); spiceItem.m_refName = comp->GetRef( &sheetList[sheet_idx] ); // Duplicate references will result in simulation errors if( refNames.count( spiceItem.m_refName ) ) { DisplayError( NULL, wxT( "There are duplicate components. " "You need to annotate schematics first." ) ); return false; } refNames.insert( spiceItem.m_refName ); // Check to see if component should be removed from Spice netlist spiceItem.m_enabled = StringToBool( GetSpiceField( SF_ENABLED, comp, aCtl ) ); if( fieldLibFile && !fieldLibFile->GetText().IsEmpty() ) m_libraries.insert( fieldLibFile->GetText() ); wxArrayString pinNames; // Store pin information for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ ) { NETLIST_OBJECT* pin = m_SortedComponentPinList[ii]; // NETLIST_EXPORTER marks removed pins by setting them to NULL if( !pin ) continue; spiceItem.m_pins.push_back( pin ); pinNames.Add( pin->GetPinNumText() ); // Create net mapping const wxString& netName = pin->GetNetName(); if( m_netMap.count( netName ) == 0 ) m_netMap[netName] = netIdx++; } // Check if an alternative pin sequence is available: if( fieldSeq ) { // Get the string containing the sequence of nodes: wxString nodeSeqIndexLineStr = fieldSeq->GetText(); // Verify field exists and is not empty: if( !nodeSeqIndexLineStr.IsEmpty() ) { // Get Alt Pin Name Array From User: wxStringTokenizer tkz( nodeSeqIndexLineStr, delimiters ); while( tkz.HasMoreTokens() ) { wxString pinIndex = tkz.GetNextToken(); int seq; // Find PinName In Standard List assign Standard List Index to Name: seq = pinNames.Index( pinIndex ); if( seq != wxNOT_FOUND ) spiceItem.m_pinSequence.push_back( seq ); } } } m_spiceItems.push_back( spiceItem ); } } return true; }