Horizon
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 
37 namespace PNS {
38 
39 class ROUTER;
40 class SHOVE;
41 class OPTIMIZER;
42 class VIA;
43 class SIZES_SETTINGS;
44 
45 
53 {
54 public:
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 
151 private:
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  OPT<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:399
void SetOrthoMode(bool aOrthoMode) override
Function SetOrthoMode()
Definition: pns_diff_pair_placer.cpp:82
bool HasPlacedAnything() const override
Definition: pns_diff_pair_placer.cpp:821
void GetModifiedNets(std::vector< int > &aNets) const override
Function GetModifiedNets.
Definition: pns_diff_pair_placer.cpp:838
bool ToggleVia(bool aEnabled) override
Enable/disable a via at the end of currently routed trace.
Definition: pns_diff_pair_placer.cpp:91
bool AbortPlacement() override
Definition: pns_diff_pair_placer.cpp:814
const std::vector< int > CurrentNets() const override
Return the net code of currently routed track.
Definition: pns_diff_pair_placer.cpp:858
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:572
bool CommitPlacement() override
Definition: pns_diff_pair_placer.cpp:827
const ITEM_SET Traces() override
Return the complete routed line, as a single-member ITEM_SET.
Definition: pns_diff_pair_placer.cpp:379
const VECTOR2I & CurrentEnd() const override
Return the current end of the line being placed.
Definition: pns_diff_pair_placer.h:110
void FlipPosture() override
Toggle the current posture (straight/diagonal) of the trace head.
Definition: pns_diff_pair_placer.cpp:390
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:730
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:708
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:748
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:408
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