110 const wxString chainName = wxT(
"TEST_SYNTH_FILTER_CHAIN" );
112 m_project = &m_schematic->Project();
113 auto& manager = m_schematic->NetChains();
115 BOOST_REQUIRE( !manager.GetPotentialNetChains().front()->GetSymbols().empty() );
116 SCH_SYMBOL* driver = *manager.GetPotentialNetChains().front()->GetSymbols().begin();
121 item->SetExcludedFromBoard( item != driver, &
path );
124 m_schematic->RebuildConnectivity();
125 BOOST_REQUIRE_EQUAL( manager.GetPotentialNetChains().size(), 1u );
126 auto* potential = manager.GetPotentialNetChains().front().get();
128 std::vector<wxString> realNets;
129 std::vector<wxString> syntheticNets;
131 for(
const wxString& net : potential->GetNets() )
134 syntheticNets.push_back( net );
136 realNets.push_back( net );
139 BOOST_REQUIRE_GE( realNets.size(), 2u );
141 const wxString realNetA = realNets[0];
142 const wxString realNetB = realNets[1];
143 const wxString synthName = syntheticNets.front();
144 SCH_NETCHAIN* committed = manager.CreateNetChainFromPotential( potential, chainName );
146 BOOST_REQUIRE_EQUAL( committed->
GetNets().count( synthName ), 1u );
147 SCH_SHEET* topSheet = m_schematic->GetTopLevelSheet();
149 wxString rootFileName = PathInWorkDir( wxT(
"synth_filter.kicad_sch" ) );
150 topSheet->
SetFileName( wxT(
"synth_filter.kicad_sch" ) );
154 wxFileName xmlFile( rootFileName );
155 xmlFile.SetName( xmlFile.GetName() + wxT(
"_netlist" ) );
156 xmlFile.SetExt( wxT(
"xml" ) );
157 m_tempFiles.push_back( xmlFile.GetFullPath() );
167 const auto& chains = m_schematic->NetChains().GetCommittedNetChains();
169 if( chains.size() != 1u )
173 chains.front()->AddNet( transient );
179 std::unique_ptr<FILTER_EXPORTER> exporter =
180 std::make_unique<FILTER_EXPORTER>( m_schematic.get() );
181 exporter->transient = synthName;
192 wxFFile rawXml( xmlFile.GetFullPath(),
"rb" );
196 rawXml.ReadAll( &xmlText );
201 "XML netlist must not contain synthetic __SG_* net names" );
210 wxXmlNode* netChains =
find_child( xdoc.GetRoot(), wxT(
"net_chains" ) );
213 wxXmlNode* targetChain =
nullptr;
215 for( wxXmlNode* xchain = netChains->GetChildren(); xchain; xchain = xchain->GetNext() )
217 if( xchain->GetName() != wxT(
"net_chain" ) )
220 if( xchain->GetAttribute( wxT(
"name" ), wxEmptyString ) == chainName )
222 targetChain = xchain;
227 BOOST_REQUIRE_MESSAGE( targetChain,
"Committed chain missing from XML output" );
229 wxXmlNode* members =
find_child( targetChain, wxT(
"members" ) );
232 std::set<wxString> emittedNets;
234 for( wxXmlNode* xmem = members->GetChildren(); xmem; xmem = xmem->GetNext() )
236 if( xmem->GetName() != wxT(
"member" ) )
239 emittedNets.insert( xmem->GetAttribute( wxT(
"net" ), wxEmptyString ) );
242 BOOST_CHECK( emittedNets.count( realNetA ) == 1u );
243 BOOST_CHECK( emittedNets.count( realNetB ) == 1u );
244 BOOST_CHECK_MESSAGE( emittedNets.count( synthName ) == 0u,
245 "Synthetic net leaked into XML <member> list" );
253 m_schematic.get() ) );
256 wxFFile rawSexpr( rootFileName,
"rb" );
260 rawSexpr.ReadAll( &sexprText );
265 "kicad_sch must not contain synthetic __SG_* net names" );
270 BOOST_CHECK_MESSAGE( sexprText.Find( wxT(
"(net_chain" ) ) != wxNOT_FOUND,
271 "kicad_sch must contain the committed net_chain section" );
272 BOOST_CHECK_MESSAGE( sexprText.Find( chainName ) != wxNOT_FOUND,
273 "kicad_sch must reference the committed chain by name" );
274 BOOST_CHECK_MESSAGE( sexprText.Find( realNetA ) != wxNOT_FOUND,
275 "kicad_sch must retain real net A in the chain's nets list" );
276 BOOST_CHECK_MESSAGE( sexprText.Find( realNetB ) != wxNOT_FOUND,
277 "kicad_sch must retain real net B in the chain's nets list" );
288 BOOST_REQUIRE_NO_THROW(
293 auto it = overrides.find( chainName );
294 BOOST_REQUIRE_MESSAGE( it != overrides.end(),
295 "Reloaded schematic missing chain member-net override" );
297 const std::set<wxString>& reloadedNets = it->second;
298 BOOST_CHECK( !reloadedNets.empty() );
299 BOOST_CHECK( reloadedNets.count( realNetA ) == 1u );
300 BOOST_CHECK( reloadedNets.count( realNetB ) == 1u );
302 for(
const wxString& n : reloadedNets )
306 "Reloaded chain leaked a synthetic __SG_* member" );