Horizon
Loading...
Searching...
No Matches
pns_diff_pair_placer.h
1/*
2 * KiRouter - a push-and-(sometimes-)shove PCB router
3 *
4 * Copyright (C) 2013-2014 CERN
5 * Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
8 *
9 * This program is free software: you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation, either version 3 of the License, or (at your
12 * option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23#ifndef __PNS_DIFF_PLACER_H
24#define __PNS_DIFF_PLACER_H
25
26#include <math/vector2d.h>
27
28#include "pns_sizes_settings.h"
29#include "pns_node.h"
30#include "pns_via.h"
31#include "pns_line.h"
32#include "pns_algo_base.h"
33#include "pns_diff_pair.h"
34
35#include "pns_placement_algo.h"
36
37namespace PNS {
38
39class ROUTER;
40class SHOVE;
41class OPTIMIZER;
42class VIA;
43class SIZES_SETTINGS;
44
45
53{
54public:
55 DIFF_PAIR_PLACER( ROUTER* aRouter );
57
58 static bool FindDpPrimitivePair( NODE* aWorld, const VECTOR2I& aP, ITEM* aItem,
59 DP_PRIMITIVE_PAIR& aPair, wxString* aErrorMsg = nullptr );
60
64 bool Start( const VECTOR2I& aP, ITEM* aStartItem ) override;
65
70 bool Move( const VECTOR2I& aP, ITEM* aEndItem ) override;
71
80 bool FixRoute( const VECTOR2I& aP, ITEM* aEndItem, bool aForceFinish ) override;
81
83 bool CommitPlacement() override;
84
86 bool AbortPlacement() override;
87
89 bool HasPlacedAnything() const override;
90
94 bool ToggleVia( bool aEnabled ) override;
95
99 bool SetLayer( int aLayer ) override;
100
104 const ITEM_SET Traces() override;
105
110 const VECTOR2I& CurrentEnd() const override
111 {
112 return m_currentEnd;
113 }
114
118 const std::vector<int> CurrentNets() const override;
119
123 int CurrentLayer() const override
124 {
125 return m_currentLayer;
126 }
127
131 NODE* CurrentNode( bool aLoopsRemoved = false ) const override;
132
136 void FlipPosture() override;
137
143 void UpdateSizes( const SIZES_SETTINGS& aSizes ) override;
144
145 bool IsPlacingVia() const override { return m_placingVia; }
146
147 void SetOrthoMode( bool aOrthoMode ) override;
148
149 void GetModifiedNets( std::vector<int>& aNets ) const override;
150
151private:
152 int viaGap() const;
153 int gap() const;
154
165 bool route( const VECTOR2I& aP );
166
171 void updateLeadingRatLine();
172
176 void setWorld( NODE* aWorld );
177
181 void initPlacement( );
182
188 void setInitialDirection( const DIRECTION_45& aDirection );
189
190
191 bool routeHead( const VECTOR2I& aP );
192 bool tryWalkDp( NODE* aNode, DIFF_PAIR& aPair, bool aSolidsOnly );
193
195 bool rhWalkOnly( const VECTOR2I& aP );
196
198 bool rhShoveOnly ( const VECTOR2I& aP );
199
201 bool rhMarkObstacles( const VECTOR2I& aP );
202
203 const VIA makeVia ( const VECTOR2I& aP, int aNet );
204
205 bool attemptWalk( NODE* aNode, DIFF_PAIR* aCurrent, DIFF_PAIR& aWalk, bool aPFirst,
206 bool aWindCw, bool aSolidsOnly );
207 bool propagateDpHeadForces ( const VECTOR2I& aP, VECTOR2I& aNewP );
208
209 enum State {
210 RT_START = 0,
211 RT_ROUTE = 1,
212 RT_FINISH = 2
213 };
214
215 State m_state;
216
217 bool m_chainedPlacement;
218 bool m_initialDiagonal;
219 bool m_startDiagonal;
220 bool m_fitOk;
221
222 int m_netP, m_netN;
223
224 DP_PRIMITIVE_PAIR m_start;
225 std::optional<DP_PRIMITIVE_PAIR> m_prevPair;
226
228 int m_iteration;
229
231 NODE* m_world;
232
234 VECTOR2I m_p_start;
235
237 std::unique_ptr<SHOVE> m_shove;
238
240 NODE* m_currentNode;
241
243 NODE* m_lastNode;
244
245 SIZES_SETTINGS m_sizes;
246
248 bool m_placingVia;
249
251 int m_viaDiameter;
252
254 int m_viaDrill;
255
257 int m_currentWidth;
258
259 int m_currentNet;
260 int m_currentLayer;
261
262 bool m_startsOnVia;
263 bool m_orthoMode;
264 bool m_snapOnTarget;
265
266 VECTOR2I m_currentEnd, m_currentStart;
267 DIFF_PAIR m_currentTrace;
268 bool m_currentTraceOk;
269
270 ITEM* m_currentEndItem;
271
272 bool m_idle;
273};
274
275}
276
277#endif // __PNS_LINE_PLACER_H
Represent route directions & corner angles in a 45-degree metric.
Definition direction45.h:37
Single track placement algorithm.
Definition pns_diff_pair_placer.h:53
NODE * CurrentNode(bool aLoopsRemoved=false) const override
Return the most recent world state.
Definition pns_diff_pair_placer.cpp:400
void SetOrthoMode(bool aOrthoMode) override
Function SetOrthoMode()
Definition pns_diff_pair_placer.cpp:83
bool HasPlacedAnything() const override
Definition pns_diff_pair_placer.cpp:822
void GetModifiedNets(std::vector< int > &aNets) const override
Function GetModifiedNets.
Definition pns_diff_pair_placer.cpp:839
bool ToggleVia(bool aEnabled) override
Enable/disable a via at the end of currently routed trace.
Definition pns_diff_pair_placer.cpp:92
bool AbortPlacement() override
Definition pns_diff_pair_placer.cpp:815
const std::vector< int > CurrentNets() const override
Return the net code of currently routed track.
Definition pns_diff_pair_placer.cpp:859
bool Start(const VECTOR2I &aP, ITEM *aStartItem) override
Start routing a single track at point aP, taking item aStartItem as anchor (unless NULL).
Definition pns_diff_pair_placer.cpp:573
bool CommitPlacement() override
Definition pns_diff_pair_placer.cpp:828
const ITEM_SET Traces() override
Return the complete routed line, as a single-member ITEM_SET.
Definition pns_diff_pair_placer.cpp:380
void FlipPosture() override
Toggle the current posture (straight/diagonal) of the trace head.
Definition pns_diff_pair_placer.cpp:391
void UpdateSizes(const SIZES_SETTINGS &aSizes) override
Perform on-the-fly update of the width, via diameter & drill size from a settings class.
Definition pns_diff_pair_placer.cpp:731
bool Move(const VECTOR2I &aP, ITEM *aEndItem) override
Move the end of the currently routed trace to the point aP, taking aEndItem as anchor (if not NULL).
Definition pns_diff_pair_placer.cpp:709
bool IsPlacingVia() const override
Function IsPlacingVia()
Definition pns_diff_pair_placer.h:145
bool FixRoute(const VECTOR2I &aP, ITEM *aEndItem, bool aForceFinish) override
Commit the currently routed track to the parent node, taking aP as the final end point and aEndItem a...
Definition pns_diff_pair_placer.cpp:749
int CurrentLayer() const override
Return the layer of currently routed track.
Definition pns_diff_pair_placer.h:123
bool SetLayer(int aLayer) override
Set the current routing layer.
Definition pns_diff_pair_placer.cpp:409
const VECTOR2I & CurrentEnd() const override
Return the current end of the line being placed.
Definition pns_diff_pair_placer.h:110
Basic class for a differential pair.
Definition pns_diff_pair.h:235
Store starting/ending primitives (pads, vias or segments) for a differential pair.
Definition pns_diff_pair.h:120
Definition pns_itemset.h:37
Base class for PNS router board items.
Definition pns_item.h:57
Keep the router "world" - i.e.
Definition pns_node.h:148
PLACEMENT_ALGO.
Definition pns_placement_algo.h:46
Definition pns_router.h:116
Definition pns_sizes_settings.h:42
Definition pns_via.h:49
Definition wx_compat.h:13