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 int64_t aDelay, const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
175{
176 const wxString delayProfileName = aContext.NetClass->GetTuningProfile();
177 const TUNING_PROFILE* profile = GetTuningProfile( delayProfileName );
178
179 if( !profile )
180 return 0;
181
182 double delayUnit = 0.0;
183
184 if( profile->m_TrackPropagationEntriesMap.contains( aContext.Layer ) )
185 {
186 const DELAY_PROFILE_TRACK_PROPAGATION_ENTRY& entry = profile->m_TrackPropagationEntriesMap.at( aContext.Layer );
187 delayUnit = entry.GetDelay();
188 }
189
190 const double lengthInMM = static_cast<double>( aDelay ) / delayUnit; // MM
191 return static_cast<int64_t>( lengthInMM * PCB_IU_PER_MM ); // Length IU
192}
193
194
196 const SHAPE_LINE_CHAIN& aShape, const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
197{
198 const wxString delayProfileName = aContext.NetClass->GetTuningProfile();
199 const TUNING_PROFILE* profile = GetTuningProfile( delayProfileName );
200
201 if( !profile )
202 return 0;
203
204 double delayUnit = 0.0;
205
206 if( profile->m_TrackPropagationEntriesMap.contains( aContext.Layer ) )
207 {
208 const DELAY_PROFILE_TRACK_PROPAGATION_ENTRY& entry = profile->m_TrackPropagationEntriesMap.at( aContext.Layer );
209 delayUnit = entry.GetDelay();
210 }
211
212 return static_cast<int64_t>( delayUnit * ( static_cast<double>( aShape.Length() ) / PCB_IU_PER_MM ) );
213}
214
215
217{
218 m_delayProfilesCache.clear();
219 m_viaOverridesCache.clear();
220
221 if( const PROJECT* project = m_board->GetProject() )
222 {
223 TUNING_PROFILES* params = project->GetProjectFile().TuningProfileParameters().get();
224
225 for( const TUNING_PROFILE& profile : params->GetTuningProfiles() )
226 {
227 m_delayProfilesCache[profile.m_ProfileName] = &profile;
228 std::map<VIA_OVERRIDE_CACHE_KEY, int64_t>& viaOverrides = m_viaOverridesCache[profile.m_ProfileName];
229
230 for( const DELAY_PROFILE_VIA_OVERRIDE_ENTRY& viaOverride : profile.m_ViaOverrides )
231 {
232 viaOverrides[VIA_OVERRIDE_CACHE_KEY{ viaOverride.m_SignalLayerFrom, viaOverride.m_SignalLayerTo,
233 viaOverride.m_ViaLayerFrom, viaOverride.m_ViaLayerTo }] =
234 viaOverride.m_Delay;
235 }
236 }
237 }
238}
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:252
PCB_LAYER_ID EndLayer() const
PCB_LAYER_ID StartLayer() const
int GetPadToDieDelay() const
Definition pad.h:576
const PADSTACK & Padstack() const
Definition pcb_track.h:402
Container for project specific data.
Definition project.h:62
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.
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.
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:822
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