KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_netlist.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2012 Jean-Pierre Charras.
5 * Copyright (C) 2013-2016 Wayne Stambaugh <[email protected]>.
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#ifndef PCB_NETLIST_H
27#define PCB_NETLIST_H
28
29#include <boost/ptr_container/ptr_vector.hpp>
30#include <wx/arrstr.h>
31#include <json_common.h>
32#include <unordered_set>
33
34#include <lib_id.h>
35#include <footprint.h>
36#include <ctl_flags.h>
37
38
39class REPORTER;
40
41
46class COMPONENT_NET
47{
48public:
50
51 COMPONENT_NET( const wxString& aPinName, const wxString& aNetName,
52 const wxString& aPinFunction, const wxString& aPinType ) :
53 m_pinName( aPinName ),
54 m_netName( aNetName ),
55 m_pinFunction( aPinFunction ),
56 m_pinType( aPinType )
57 {
58 }
59
60 const wxString& GetPinName() const { return m_pinName; }
61 const wxString& GetNetName() const { return m_netName; }
62 const wxString& GetPinFunction() const { return m_pinFunction; }
63 const wxString& GetPinType() const { return m_pinType; }
64
65 bool IsValid() const { return !m_pinName.IsEmpty(); }
66
67 bool operator <( const COMPONENT_NET& aNet ) const
68 {
69 return m_pinName < aNet.m_pinName;
70 }
71
72 int Format( OUTPUTFORMATTER* aOut, int aNestLevel, int aCtl );
73
74private:
75 wxString m_pinName;
76 wxString m_netName;
77 wxString m_pinFunction;
78 wxString m_pinType;
79};
80
81
82typedef std::vector< COMPONENT_NET > COMPONENT_NETS;
83
84
85struct NETLIST_GROUP
86{
87 wxString name;
88 KIID uuid;
90 std::vector<KIID> members;
91};
92
93typedef boost::ptr_vector< NETLIST_GROUP > NETLIST_GROUPS;
94
95
99class COMPONENT
100{
101public:
102 COMPONENT( const LIB_ID& aFPID,
103 const wxString& aReference,
104 const wxString& aValue,
105 const KIID_PATH& aPath,
106 const std::vector<KIID>& aKiids )
107 {
108 m_fpid = aFPID;
109 m_reference = aReference;
110 m_value = aValue;
111 m_pinCount = 0;
112 m_path = aPath;
113 m_kiids = aKiids;
115 m_group = nullptr;
116 }
117
118 virtual ~COMPONENT() { };
119
120 void AddNet( const wxString& aPinName, const wxString& aNetName, const wxString& aPinFunction,
121 const wxString& aPinType )
122 {
123 m_nets.emplace_back( aPinName, aNetName, aPinFunction, aPinType );
124 }
125
126 unsigned GetNetCount() const { return m_nets.size(); }
127
128 const COMPONENT_NET& GetNet( unsigned aIndex ) const { return m_nets[aIndex]; }
129
130 const COMPONENT_NET& GetNet( const wxString& aPinName ) const;
131
132 void ClearNets() { m_nets.clear(); }
133
134 void SortPins() { sort( m_nets.begin(), m_nets.end() ); }
135
136 void SetName( const wxString& aName ) { m_name = aName;}
137 const wxString& GetName() const { return m_name; }
138
139 void SetLibrary( const wxString& aLibrary ) { m_library = aLibrary; }
140 const wxString& GetLibrary() const { return m_library; }
141
142 void SetReference( const wxString& aReference ) { m_reference = aReference; }
143 const wxString& GetReference() const { return m_reference; }
144
145 void SetValue( const wxString& aValue ) { m_value = aValue; }
146 const wxString& GetValue() const { return m_value; }
147
148 void SetFields( nlohmann::ordered_map<wxString, wxString> aFields )
149 {
150 m_fields = std::move( aFields );
151 }
152 const nlohmann::ordered_map<wxString, wxString>& GetFields() const { return m_fields; }
153
154 void SetProperties( std::map<wxString, wxString> aProps )
155 {
156 m_properties = std::move( aProps );
157 }
158 const std::map<wxString, wxString>& GetProperties() const { return m_properties; }
159
160 void SetFPID( const LIB_ID& aFPID ) { m_fpid = aFPID; }
161 const LIB_ID& GetFPID() const { return m_fpid; }
162
163 void SetAltFPID( const LIB_ID& aFPID ) { m_altFpid = aFPID; }
164 const LIB_ID& GetAltFPID() const { return m_altFpid; }
165
166 const KIID_PATH& GetPath() const { return m_path; }
167
168 const std::vector<KIID>& GetKIIDs() const { return m_kiids; }
169
170 void SetFootprintFilters( const wxArrayString& aFilters ) { m_footprintFilters = aFilters; }
171 const wxArrayString& GetFootprintFilters() const { return m_footprintFilters; }
172
173 void SetPinCount( int aPinCount ) { m_pinCount = aPinCount; }
174 int GetPinCount() const { return m_pinCount; }
175
176 FOOTPRINT* GetFootprint( bool aRelease = false )
177 {
178 return ( aRelease ) ? m_footprint.release() : m_footprint.get();
179 }
180
181 void SetFootprint( FOOTPRINT* aFootprint );
182
183 bool IsLibSource( const wxString& aLibrary, const wxString& aName ) const
184 {
185 return aLibrary == m_library && aName == m_name;
186 }
187
188 void Format( OUTPUTFORMATTER* aOut, int aNestLevel, int aCtl );
189
190 void SetHumanReadablePath( const wxString& aPath ) { m_humanReadablePath = aPath; }
191 const wxString& GetHumanReadablePath() const { return m_humanReadablePath; }
192
193 void SetComponentClassNames( const std::unordered_set<wxString>& aClassNames )
194 {
195 m_componentClassNames = aClassNames;
196 }
197
198 std::unordered_set<wxString>& GetComponentClassNames() { return m_componentClassNames; }
199
202
203 std::vector<std::set<wxString>>& JumperPadGroups() { return m_jumperPadGroups; }
204 const std::vector<std::set<wxString>>& JumperPadGroups() const { return m_jumperPadGroups; }
205
206 NETLIST_GROUP* GetGroup() const { return m_group; }
207 void SetGroup( NETLIST_GROUP* aGroup ) { m_group = aGroup; }
208
209 // Unit info for multi-unit symbols
210 struct UNIT_INFO
211 {
212 wxString m_unitName; // e.g. A
213 std::vector<wxString> m_pins; // pin numbers in this unit
214 };
215
216 void SetUnitInfo( const std::vector<UNIT_INFO>& aUnits ) { m_units = aUnits; }
217 const std::vector<UNIT_INFO>& GetUnitInfo() const { return m_units; }
218
219private:
220 std::vector<COMPONENT_NET> m_nets;
221
222 wxArrayString m_footprintFilters;
223 int m_pinCount;
224 wxString m_reference;
225 wxString m_value;
226
227 // human-readable hierarchical sheet path (e.g. /root/block0/sheet1)
228 wxString m_humanReadablePath;
229
232
234 std::vector<KIID> m_kiids;
235
237 wxString m_name;
238
240 wxString m_library;
241
244
249
251 std::unique_ptr<FOOTPRINT> m_footprint;
252
254 std::map<wxString, wxString> m_properties;
255
257 nlohmann::ordered_map<wxString, wxString> m_fields;
258
260 std::unordered_set<wxString> m_componentClassNames;
261
263 std::vector<std::set<wxString>> m_jumperPadGroups;
264
268
271
273
274 // Unit information parsed from the netlist (optional)
275 std::vector<UNIT_INFO> m_units;
276};
277
278
279typedef boost::ptr_vector< COMPONENT > COMPONENTS;
280
281
286class NETLIST
287{
288public:
290 m_findByTimeStamp( false ),
291 m_replaceFootprints( false )
292 {
293 }
294
298 bool IsEmpty() const { return m_components.empty(); }
299
303 void Clear() { m_components.clear(); }
304
308 unsigned GetCount() const { return m_components.size(); }
309
316 COMPONENT* GetComponent( unsigned aIndex ) { return &m_components[ aIndex ]; }
317
326 void AddComponent( COMPONENT* aComponent );
327
334 void AddGroup( NETLIST_GROUP* aGroup );
335
344
350
357 COMPONENT* GetComponentByReference( const wxString& aReference );
358
366
374
377
378 void SetFindByTimeStamp( bool aFindByTimeStamp ) { m_findByTimeStamp = aFindByTimeStamp; }
379 bool IsFindByTimeStamp() const { return m_findByTimeStamp; }
380
381 void SetReplaceFootprints( bool aReplace ) { m_replaceFootprints = aReplace; }
383
388
389 void Format( const char* aDocName, OUTPUTFORMATTER* aOut, int aNestLevel, int aCtl = 0 );
390
391#define CTL_FOR_CVPCB (CTL_OMIT_NETS | CTL_OMIT_FILTERS | CTL_OMIT_EXTRA)
392
394 {
395 Format( "cvpcb_netlist", aOut, 0, CTL_FOR_CVPCB );
396 }
397
398private:
399 COMPONENTS m_components; // Components found in the netlist.
400 NETLIST_GROUPS m_groups; // Groups found in the netlist.
401
402
403 bool m_findByTimeStamp; // Associate components by KIID (or refdes if false)
404 bool m_replaceFootprints; // Update footprints to match footprints defined in netlist
405};
406
407
408#endif // PCB_NETLIST_H
const char * name
Used to store the component pin name to net name (and pin function) associations stored in a netlist.
const wxString & GetNetName() const
Definition pcb_netlist.h:61
COMPONENT_NET(const wxString &aPinName, const wxString &aNetName, const wxString &aPinFunction, const wxString &aPinType)
Definition pcb_netlist.h:51
int Format(OUTPUTFORMATTER *aOut, int aNestLevel, int aCtl)
bool operator<(const COMPONENT_NET &aNet) const
bool IsValid() const
Definition pcb_netlist.h:65
const wxString & GetPinFunction() const
Definition pcb_netlist.h:62
const wxString & GetPinName() const
Definition pcb_netlist.h:60
const wxString & GetPinType() const
Definition pcb_netlist.h:63
Store all of the related component information found in a netlist.
const std::vector< std::set< wxString > > & JumperPadGroups() const
const std::vector< UNIT_INFO > & GetUnitInfo() const
const wxString & GetHumanReadablePath() const
const COMPONENT_NET & GetNet(unsigned aIndex) const
const KIID_PATH & GetPath() const
void SetValue(const wxString &aValue)
std::vector< COMPONENT_NET > m_nets
list of nets shared by the component pins
void SetLibrary(const wxString &aLibrary)
std::map< wxString, wxString > m_properties
Component-specific properties found in the netlist.
wxArrayString m_footprintFilters
const wxString & GetReference() const
virtual ~COMPONENT()
void SetAltFPID(const LIB_ID &aFPID)
void Format(OUTPUTFORMATTER *aOut, int aNestLevel, int aCtl)
const wxString & GetValue() const
void SetProperties(std::map< wxString, wxString > aProps)
KIID_PATH m_path
A fully specified path to the component (but not the component: [ sheetUUID, sheetUUID,...
const nlohmann::ordered_map< wxString, wxString > & GetFields() const
NETLIST_GROUP * m_group
Group membership for this footprint. Nullptr if none.
bool m_duplicatePadNumbersAreJumpers
Flag that this footprint should automatically treat sets of two or more pads with the same number as ...
const std::map< wxString, wxString > & GetProperties() const
nlohmann::ordered_map< wxString, wxString > m_fields
Component-specific user fields found in the netlist.
int GetPinCount() const
void SetFPID(const LIB_ID &aFPID)
void SortPins()
void SetPinCount(int aPinCount)
void SetUnitInfo(const std::vector< UNIT_INFO > &aUnits)
const COMPONENT_NET & GetNet(const wxString &aPinName) const
std::unordered_set< wxString > m_componentClassNames
Component classes for this footprint.
void ClearNets()
wxString m_name
The name of the component in m_library used when it was placed on the schematic.
LIB_ID m_altFpid
The alt LIB_ID of the footprint, when there are 2 different assigned footprints, One from the netlist...
const LIB_ID & GetAltFPID() const
void SetFootprint(FOOTPRINT *aFootprint)
bool IsLibSource(const wxString &aLibrary, const wxString &aName) const
std::vector< KIID > m_kiids
A vector of possible KIIDs corresponding to all units in a symbol.
FOOTPRINT * GetFootprint(bool aRelease=false)
NETLIST_GROUP * GetGroup() const
void SetFootprintFilters(const wxArrayString &aFilters)
void AddNet(const wxString &aPinName, const wxString &aNetName, const wxString &aPinFunction, const wxString &aPinType)
wxString m_library
The name of the component library where m_name was found.
LIB_ID m_fpid
The LIB_ID of the footprint assigned to the component.
const wxArrayString & GetFootprintFilters() const
static COMPONENT_NET m_emptyNet
void SetFields(nlohmann::ordered_map< wxString, wxString > aFields)
const std::vector< KIID > & GetKIIDs() const
COMPONENT(const LIB_ID &aFPID, const wxString &aReference, const wxString &aValue, const KIID_PATH &aPath, const std::vector< KIID > &aKiids)
void SetHumanReadablePath(const wxString &aPath)
std::unique_ptr< FOOTPRINT > m_footprint
The FOOTPRINT loaded for #m_FPID.
void SetDuplicatePadNumbersAreJumpers(bool aEnabled)
bool GetDuplicatePadNumbersAreJumpers() const
const LIB_ID & GetFPID() const
void SetGroup(NETLIST_GROUP *aGroup)
std::vector< UNIT_INFO > m_units
std::vector< std::set< wxString > > m_jumperPadGroups
Jumper pad groups for this footprint.
unsigned GetNetCount() const
std::unordered_set< wxString > & GetComponentClassNames()
const wxString & GetLibrary() const
void SetComponentClassNames(const std::unordered_set< wxString > &aClassNames)
const wxString & GetName() const
std::vector< std::set< wxString > > & JumperPadGroups()
void SetName(const wxString &aName)
void SetReference(const wxString &aReference)
Definition kiid.h:49
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
void Format(const char *aDocName, OUTPUTFORMATTER *aOut, int aNestLevel, int aCtl=0)
bool GetReplaceFootprints() const
void SetReplaceFootprints(bool aReplace)
void SortByFPID()
unsigned GetCount() const
void AddGroup(NETLIST_GROUP *aGroup)
void AddComponent(COMPONENT *aComponent)
Add aComponent to the NETLIST.
bool IsEmpty() const
COMPONENT * GetComponentByPath(const KIID_PATH &aPath)
Return a COMPONENT by aPath.
COMPONENT * GetComponentByReference(const wxString &aReference)
Return a COMPONENT by aReference.
void Clear()
Remove all components from the netlist.
COMPONENT * GetComponentByUuid(const KIID &aUuid)
Return a COMPONENT by aUuid.
void SetFindByTimeStamp(bool aFindByTimeStamp)
NETLIST_GROUP * GetGroupByUuid(const KIID &aUuid)
Return a NETLIST_GROUP by aUuid.
COMPONENT * GetComponent(unsigned aIndex)
Return the COMPONENT at aIndex.
void ApplyGroupMembership()
After groups and components are parsed, apply the group memberships to the internal components based ...
bool IsFindByTimeStamp() const
void SortByReference()
void FormatCvpcbNetlist(OUTPUTFORMATTER *aOut)
bool AnyFootprintsLinked() const
An interface used to output 8 bit text in a convenient way.
Definition richio.h:323
A pure virtual class used to derive REPORTER objects from.
Definition reporter.h:73
std::vector< COMPONENT_NET > COMPONENT_NETS
boost::ptr_vector< COMPONENT > COMPONENTS
boost::ptr_vector< NETLIST_GROUP > NETLIST_GROUPS
#define CTL_FOR_CVPCB
std::vector< KIID > members