KiCad PCB EDA Suite
Loading...
Searching...
No Matches
tuning_profile_parameters_user_defined.cpp
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 The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
21
22#include <board.h>
24#include <pad.h>
25#include <pcb_track.h>
27
28
33
34
35std::vector<int64_t>
36TUNING_PROFILE_PARAMETERS_USER_DEFINED::GetPropagationDelays( const std::vector<LENGTH_DELAY_CALCULATION_ITEM>& aItems,
37 const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
38{
39 if( aItems.empty() )
40 return {};
41
42 const wxString delayProfileName = aItems.front().GetEffectiveNetClass()->GetTuningProfile();
43 const TUNING_PROFILE* delayProfile = GetTuningProfile( delayProfileName );
44
45 if( !delayProfile )
46 return std::vector<int64_t>( aItems.size(), 0 );
47
48 std::vector<int64_t> propagationDelays;
49 propagationDelays.reserve( aItems.size() );
50
51 for( const LENGTH_DELAY_CALCULATION_ITEM& item : aItems )
52 propagationDelays.emplace_back( getPropagationDelay( item, aContext, delayProfile ) );
53
54 return propagationDelays;
55}
56
57
59 const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
60{
62 return 0;
63
64 const wxString delayProfileName = aItem.GetEffectiveNetClass()->GetTuningProfile();
65 const TUNING_PROFILE* delayProfile = GetTuningProfile( delayProfileName );
66
67 if( !delayProfile )
68 return 0;
69
70 return getPropagationDelay( aItem, aContext, delayProfile );
71}
72
73
75 const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext,
76 const TUNING_PROFILE* aDelayProfile ) const
77{
79 return 0;
80
81 const LENGTH_DELAY_CALCULATION_ITEM::TYPE itemType = aItem.Type();
82
83 if( itemType == LENGTH_DELAY_CALCULATION_ITEM::TYPE::LINE )
84 {
85 double delayUnit = 0.0;
86
87 if( aDelayProfile->m_TrackPropagationEntriesMap.contains( aItem.GetStartLayer() ) )
88 {
90 aDelayProfile->m_TrackPropagationEntriesMap.at( aItem.GetStartLayer() );
91 delayUnit = entry.GetDelay();
92 }
93
94 return static_cast<int64_t>( delayUnit * ( static_cast<double>( aItem.GetLine().Length() ) / PCB_IU_PER_MM ) );
95 }
96
97 if( itemType == LENGTH_DELAY_CALCULATION_ITEM::TYPE::VIA )
98 {
99 if( !aDelayProfile->m_EnableTimeDomainTuning )
100 return 0;
101
102 const PCB_LAYER_ID signalStartLayer = aItem.GetStartLayer();
103 const PCB_LAYER_ID signalEndLayer = aItem.GetEndLayer();
104 const PCB_LAYER_ID viaStartLayer = aItem.GetVia()->Padstack().StartLayer();
105 const PCB_LAYER_ID viaEndLayer = aItem.GetVia()->Padstack().EndLayer();
106
107 return getViaPropagationDelay( signalStartLayer, signalEndLayer, viaStartLayer, viaEndLayer, aDelayProfile );
108 }
109
110 if( itemType == LENGTH_DELAY_CALCULATION_ITEM::TYPE::PAD )
111 {
112 return aItem.GetPad()->GetPadToDieDelay();
113 }
114
115 return 0;
116}
117
118
120 const PCB_LAYER_ID aSignalStartLayer, const PCB_LAYER_ID aSignalEndLayer, const PCB_LAYER_ID aViaStartLayer,
121 const PCB_LAYER_ID aViaEndLayer, const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext ) const
122{
123 const wxString tuningProfileName = aContext.NetClass->GetTuningProfile();
124 const TUNING_PROFILE* tuningProfile = GetTuningProfile( tuningProfileName );
125
126 if( !tuningProfile )
127 return 0;
128
129 return getViaPropagationDelay( aSignalStartLayer, aSignalEndLayer, aViaStartLayer, aViaEndLayer, tuningProfile );
130}
131
132
134 PCB_LAYER_ID aSignalEndLayer,
135 PCB_LAYER_ID aViaStartLayer,
136 PCB_LAYER_ID aViaEndLayer,
137 const TUNING_PROFILE* aTuningProfile ) const
138{
139 // Ensure ordering as per the via save order
140 if( IsCopperLayerLowerThan( aSignalStartLayer, aSignalEndLayer ) )
141 std::swap( aSignalStartLayer, aSignalEndLayer );
142
143 if( IsCopperLayerLowerThan( aViaStartLayer, aViaEndLayer ) )
144 std::swap( aViaStartLayer, aViaEndLayer );
145
146 // First check for a layer-to-layer override - this assumes that the layers are already in CuStack() order
147 auto& viaOverrides = m_viaOverridesCache.at( aTuningProfile->m_ProfileName );
148
149 const auto viaItr = viaOverrides.find(
150 VIA_OVERRIDE_CACHE_KEY{ aSignalStartLayer, aSignalEndLayer, aViaStartLayer, aViaEndLayer } );
151
152 if( viaItr != viaOverrides.end() )
153 return viaItr->second;
154
155 // Otherwise, return the tuning profile default
156 const double distance = m_lengthCalculation->StackupHeight( aSignalStartLayer, aSignalEndLayer );
157 return static_cast<int64_t>( aTuningProfile->m_ViaPropagationDelay * ( distance / PCB_IU_PER_MM ) );
158}
159
160
161const TUNING_PROFILE*
162TUNING_PROFILE_PARAMETERS_USER_DEFINED::GetTuningProfile( const wxString& aDelayProfileName ) const
163{
164 auto itr = m_delayProfilesCache.find( aDelayProfileName );
165
166 if( itr != m_delayProfilesCache.end() )
167 return itr->second;
168
169 return nullptr;
170}
171
172
174 const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext ) const
175{
176 if( !aContext.NetClass )
177 return 0.0;
178
179 const TUNING_PROFILE* profile = GetTuningProfile( aContext.NetClass->GetTuningProfile() );
180
181 if( !profile )
182 return 0.0;
183
184 auto entry = profile->m_TrackPropagationEntriesMap.find( aContext.Layer );
185
186 if( entry == profile->m_TrackPropagationEntriesMap.end() )
187 return 0.0;
188
189 return entry->second.GetDelay();
190}
191
192
198
199
201 int64_t aDelay, const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
202{
203 const double delayUnit = getTrackDelayPerMM( aContext );
204
205 if( delayUnit <= 0.0 )
206 return 0;
207
208 const double lengthInMM = static_cast<double>( aDelay ) / delayUnit; // MM
209 return static_cast<int64_t>( lengthInMM * PCB_IU_PER_MM ); // Length IU
210}
211
212
214 const SHAPE_LINE_CHAIN& aShape, const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
215{
216 const double delayUnit = getTrackDelayPerMM( aContext );
217
218 return static_cast<int64_t>( delayUnit * ( static_cast<double>( aShape.Length() ) / PCB_IU_PER_MM ) );
219}
220
221
223{
224 m_delayProfilesCache.clear();
225 m_viaOverridesCache.clear();
226
227 if( const PROJECT* project = m_board->GetProject() )
228 {
229 TUNING_PROFILES* params = project->GetProjectFile().TuningProfileParameters().get();
230
231 for( const TUNING_PROFILE& profile : params->GetTuningProfiles() )
232 {
233 m_delayProfilesCache[profile.m_ProfileName] = &profile;
234 std::map<VIA_OVERRIDE_CACHE_KEY, int64_t>& viaOverrides = m_viaOverridesCache[profile.m_ProfileName];
235
236 for( const DELAY_PROFILE_VIA_OVERRIDE_ENTRY& viaOverride : profile.m_ViaOverrides )
237 {
238 viaOverrides[VIA_OVERRIDE_CACHE_KEY{ viaOverride.m_SignalLayerFrom, viaOverride.m_SignalLayerTo,
239 viaOverride.m_ViaLayerFrom, viaOverride.m_ViaLayerTo }] =
240 viaOverride.m_Delay;
241 }
242 }
243 }
244}
constexpr double PCB_IU_PER_MM
Pcbnew IU is 1 nanometer.
Definition base_units.h:68
Represents a single line in a time domain profile track propagation setup.
int GetDelay(const bool aForce=false) const
Lightweight class which holds a pad, via, or a routed trace outline.
MERGE_STATUS GetMergeStatus() const
Gets the MERGE_STATUS of this item.
TYPE
The type of routing object this item proxies.
TYPE Type() const
Gets the routing item type.
const PCB_VIA * GetVia() const
Gets the VIA associated with this item.
const NETCLASS * GetEffectiveNetClass() const
Returns the effective net class for the item.
SHAPE_LINE_CHAIN & GetLine() const
Gets the SHAPE_LINE_CHAIN associated with this item.
PCB_LAYER_ID GetEndLayer() const
Gets the end board layer for the proxied item.
const PAD * GetPad() const
Gets the parent PAD associated with this item.
PCB_LAYER_ID GetStartLayer() const
Gets the start board layer for the proxied item.
wxString GetTuningProfile() const
Definition netclass.h:260
PCB_LAYER_ID EndLayer() const
PCB_LAYER_ID StartLayer() const
int GetPadToDieDelay() const
Definition pad.h:579
const PADSTACK & Padstack() const
Definition pcb_track.h:418
Container for project specific data.
Definition project.h:63
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
long long int Length() const
Return length of the line chain in Euclidean metric.
TUNING_PROFILES stores the configuration for impedance / delay tuning profiles.
const std::vector< TUNING_PROFILE > & GetTuningProfiles() const
BOARD * m_board
The board all calculations are for.
LENGTH_DELAY_CALCULATION * m_lengthCalculation
The parent length / delay calculation object.
std::map< wxString, const TUNING_PROFILE * > m_delayProfilesCache
Cached map of tuning profile names to per-layer time domain parameters.
int64_t GetTrackLengthForPropagationDelay(int64_t aDelay, const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext) override
Gets the track length (in internal distance units) required for the given propagation delay (in inter...
int64_t getViaPropagationDelay(const PCB_LAYER_ID aSignalStartLayer, const PCB_LAYER_ID aSignalEndLayer, const PCB_LAYER_ID aViaStartLayer, const PCB_LAYER_ID aViaEndLayer, const TUNING_PROFILE *aTuningProfile) const
Gets the via propagation delay for the given via layer geometry.
int64_t CalculatePropagationDelayForShapeLineChain(const SHAPE_LINE_CHAIN &aShape, const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext) override
Gets the propagation delay for the given shape line chain.
std::map< wxString, std::map< VIA_OVERRIDE_CACHE_KEY, int64_t > > m_viaOverridesCache
Cached per-tuning profile via overrides.
bool CanCalculateLengthForDelay(const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext) const override
Returns true if the net class tuning profile defines a non-zero track delay for the context layer.
int64_t GetPropagationDelay(const LENGTH_DELAY_CALCULATION_ITEM &aItem, const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext) override
Gets the propagation delay (in internal units) for the given item in the given geometry context.
const TUNING_PROFILE * GetTuningProfile(const wxString &aDelayProfileName) const
Gets the tuning profile pointer for the given tuning profile name.
double getTrackDelayPerMM(const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext) const
Gets the track propagation delay per millimetre for the given geometry context.
void OnSettingsChanged() override
Event called by the length and time calculation architecture if netclass definitions have changed.
std::vector< int64_t > GetPropagationDelays(const std::vector< LENGTH_DELAY_CALCULATION_ITEM > &aItems, const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext) override
Gets the propagation delays (in internal units) for the given items in the given geometry context.
int64_t getPropagationDelay(const LENGTH_DELAY_CALCULATION_ITEM &aItem, const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext, const TUNING_PROFILE *aDelayProfile) const
Gets the propagation delay (in internal units) for the given item in the given geometry context,...
int64_t GetViaPropagationDelay(const PCB_LAYER_ID aSignalStartLayer, const PCB_LAYER_ID aSignalEndLayer, const PCB_LAYER_ID aViaStartLayer, const PCB_LAYER_ID aViaEndLayer, const TUNING_PROFILE_GEOMETRY_CONTEXT &aContext) const override
Gets the via propagation delay for the given via layer geometry.
bool IsCopperLayerLowerThan(PCB_LAYER_ID aLayerA, PCB_LAYER_ID aLayerB)
Return true if copper aLayerA is placed lower than aLayerB, false otherwise.
Definition layer_ids.h:850
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
Represents a single line in the time domain configuration via overrides configuration grid.
PCB_LAYER_ID m_SignalLayerFrom
PCB_LAYER_ID m_ViaLayerFrom
int m_Delay
PCB_LAYER_ID m_SignalLayerTo
PCB_LAYER_ID m_ViaLayerTo
A data structure to contain basic geometry data which can affect signal propagation calculations.
const NETCLASS * NetClass
The net class this track belongs to.
PCB_LAYER_ID Layer
The layer this track is on.
Represents a single line in the tuning profile configuration grid.
std::map< PCB_LAYER_ID, DELAY_PROFILE_TRACK_PROPAGATION_ENTRY > m_TrackPropagationEntriesMap