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, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <board.h>
28
29
34
35
36std::vector<int64_t>
37TUNING_PROFILE_PARAMETERS_USER_DEFINED::GetPropagationDelays( const std::vector<LENGTH_DELAY_CALCULATION_ITEM>& aItems,
38 const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
39{
40 if( aItems.empty() )
41 return {};
42
43 const wxString delayProfileName = aItems.front().GetEffectiveNetClass()->GetTuningProfile();
44 const TUNING_PROFILE* delayProfile = GetTuningProfile( delayProfileName );
45
46 if( !delayProfile )
47 return std::vector<int64_t>( aItems.size(), 0 );
48
49 std::vector<int64_t> propagationDelays;
50 propagationDelays.reserve( aItems.size() );
51
52 for( const LENGTH_DELAY_CALCULATION_ITEM& item : aItems )
53 propagationDelays.emplace_back( getPropagationDelay( item, aContext, delayProfile ) );
54
55 return propagationDelays;
56}
57
58
60 const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
61{
63 return 0;
64
65 const wxString delayProfileName = aItem.GetEffectiveNetClass()->GetTuningProfile();
66 const TUNING_PROFILE* delayProfile = GetTuningProfile( delayProfileName );
67
68 if( !delayProfile )
69 return 0;
70
71 return getPropagationDelay( aItem, aContext, delayProfile );
72}
73
74
76 const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext,
77 const TUNING_PROFILE* aDelayProfile ) const
78{
80 return 0;
81
82 const LENGTH_DELAY_CALCULATION_ITEM::TYPE itemType = aItem.Type();
83
84 if( itemType == LENGTH_DELAY_CALCULATION_ITEM::TYPE::LINE )
85 {
86 double delayUnit = 0.0;
87
88 if( aDelayProfile->m_TrackPropagationEntriesMap.contains( aItem.GetStartLayer() ) )
89 {
91 aDelayProfile->m_TrackPropagationEntriesMap.at( aItem.GetStartLayer() );
92 delayUnit = entry.GetDelay();
93 }
94
95 return static_cast<int64_t>( delayUnit * ( static_cast<double>( aItem.GetLine().Length() ) / PCB_IU_PER_MM ) );
96 }
97
98 if( itemType == LENGTH_DELAY_CALCULATION_ITEM::TYPE::VIA )
99 {
100 if( !aDelayProfile->m_EnableTimeDomainTuning )
101 return 0;
102
103 const PCB_LAYER_ID signalStartLayer = aItem.GetStartLayer();
104 const PCB_LAYER_ID signalEndLayer = aItem.GetEndLayer();
105 const PCB_LAYER_ID viaStartLayer = aItem.GetVia()->Padstack().StartLayer();
106 const PCB_LAYER_ID viaEndLayer = aItem.GetVia()->Padstack().EndLayer();
107
108 // First check for a layer-to-layer override - this assumes that the layers are already in CuStack() order
109 auto& viaOverrides = m_viaOverridesCache.at( aDelayProfile->m_ProfileName );
110
111 const auto viaItr = viaOverrides.find(
112 VIA_OVERRIDE_CACHE_KEY{ signalStartLayer, signalEndLayer, viaStartLayer, viaEndLayer } );
113
114 if( viaItr != viaOverrides.end() )
115 return viaItr->second;
116
117 // Otherwise, return the tuning profile default
118 const double distance = m_lengthCalculation->StackupHeight( signalStartLayer, signalEndLayer );
119 return static_cast<int64_t>( aDelayProfile->m_ViaPropagationDelay * ( distance / PCB_IU_PER_MM ) );
120 }
121
122 if( itemType == LENGTH_DELAY_CALCULATION_ITEM::TYPE::PAD )
123 {
124 return aItem.GetPad()->GetPadToDieDelay();
125 }
126
127 return 0;
128}
129
130
132{
133 auto itr = m_delayProfilesCache.find( aDelayProfileName );
134
135 if( itr != m_delayProfilesCache.end() )
136 return itr->second;
137
138 return nullptr;
139}
140
141
143 int64_t aDelay, const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
144{
145 const wxString delayProfileName = aContext.NetClass->GetTuningProfile();
146 const TUNING_PROFILE* profile = GetTuningProfile( delayProfileName );
147
148 if( !profile )
149 return 0;
150
151 double delayUnit = 0.0;
152
153 if( profile->m_TrackPropagationEntriesMap.contains( aContext.Layer ) )
154 {
155 const DELAY_PROFILE_TRACK_PROPAGATION_ENTRY& entry = profile->m_TrackPropagationEntriesMap.at( aContext.Layer );
156 delayUnit = entry.GetDelay();
157 }
158
159 const double lengthInMM = static_cast<double>( aDelay ) / delayUnit; // MM
160 return static_cast<int64_t>( lengthInMM * PCB_IU_PER_MM ); // Length IU
161}
162
163
165 const SHAPE_LINE_CHAIN& aShape, const TUNING_PROFILE_GEOMETRY_CONTEXT& aContext )
166{
167 const wxString delayProfileName = aContext.NetClass->GetTuningProfile();
168 const TUNING_PROFILE* profile = GetTuningProfile( delayProfileName );
169
170 if( !profile )
171 return 0;
172
173 double delayUnit = 0.0;
174
175 if( profile->m_TrackPropagationEntriesMap.contains( aContext.Layer ) )
176 {
177 const DELAY_PROFILE_TRACK_PROPAGATION_ENTRY& entry = profile->m_TrackPropagationEntriesMap.at( aContext.Layer );
178 delayUnit = entry.GetDelay();
179 }
180
181 return static_cast<int64_t>( delayUnit * ( static_cast<double>( aShape.Length() ) / PCB_IU_PER_MM ) );
182}
183
184
186{
187 m_delayProfilesCache.clear();
188 m_viaOverridesCache.clear();
189
190 if( const PROJECT* project = m_board->GetProject() )
191 {
192 TUNING_PROFILES* params = project->GetProjectFile().TuningProfileParameters().get();
193
194 for( const TUNING_PROFILE& profile : params->GetTuningProfiles() )
195 {
196 m_delayProfilesCache[profile.m_ProfileName] = &profile;
197 std::map<VIA_OVERRIDE_CACHE_KEY, int64_t>& viaOverrides = m_viaOverridesCache[profile.m_ProfileName];
198
199 for( const DELAY_PROFILE_VIA_OVERRIDE_ENTRY& viaOverride : profile.m_ViaOverrides )
200 {
201 viaOverrides[VIA_OVERRIDE_CACHE_KEY{ viaOverride.m_SignalLayerFrom, viaOverride.m_SignalLayerTo,
202 viaOverride.m_ViaLayerFrom, viaOverride.m_ViaLayerTo }] =
203 viaOverride.m_Delay;
204 }
205 }
206 }
207}
constexpr double PCB_IU_PER_MM
Pcbnew IU is 1 nanometer.
Definition base_units.h:70
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:246
PCB_LAYER_ID EndLayer() const
Definition padstack.cpp:714
PCB_LAYER_ID StartLayer() const
Definition padstack.cpp:708
int GetPadToDieDelay() const
Definition pad.h:456
const PADSTACK & Padstack() const
Definition pcb_track.h:463
Container for project specific data.
Definition project.h:66
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...
const TUNING_PROFILE * GetTuningProfile(const wxString &aDelayProfileName)
Gets the tuning profile pointer for the given tuning profile name.
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.
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,...
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
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