KiCad PCB EDA Suite
pns_diff_pair_placer.h
Go to the documentation of this file.
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,
213  };
214 
216 
220  bool m_fitOk;
221 
223 
226 
229 
232 
235 
238 
241 
244 
246 
249 
252 
255 
258 
261 
265 
269 
272 
273  bool m_idle;
274 };
275 
276 }
277 
278 #endif // __PNS_LINE_PLACER_H
bool rhWalkOnly(const VECTOR2I &aP)
route step, shove mode
Base class for PNS router board items.
Definition: pns_item.h:55
SIZES_SETTINGS m_sizes
Are we placing a via?
Definition: track.h:343
bool attemptWalk(NODE *aNode, DIFF_PAIR *aCurrent, DIFF_PAIR &aWalk, bool aPFirst, bool aWindCw, bool aSolidsOnly)
Keep the router "world" - i.e.
Definition: pns_node.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...
PNS_MODE
< Routing modes
SHOVE.
Definition: pns_shove.h:48
void GetModifiedNets(std::vector< int > &aNets) const override
Function GetModifiedNets.
bool route(const VECTOR2I &aP)
Re-route the current track to point aP.
bool rhShoveOnly(const VECTOR2I &aP)
route step, mark obstacles mode
int m_iteration
pointer to world to search colliding items
SHOVE * m_shove
Current world state.
int m_viaDiameter
current via drill
NODE * CurrentNode(bool aLoopsRemoved=false) const override
Return the most recent world state.
int CurrentLayer() const override
Return the layer of currently routed track.
NODE * m_world
current routing start point (end of tail, beginning of head)
const VIA makeVia(const VECTOR2I &aP, int aNet)
bool routeHead(const VECTOR2I &aP)
void setInitialDirection(const DIRECTION_45 &aDirection)
Set preferred direction of the very first track segment to be laid.
int m_viaDrill
current track width
bool HasPlacedAnything() const override
bool propagateDpHeadForces(const VECTOR2I &aP, VECTOR2I &aNewP)
bool ToggleVia(bool aEnabled) override
Enable/disable a via at the end of currently routed trace.
Represent route directions & corner angles in a 45-degree metric.
Definition: direction45.h:36
void UpdateSizes(const SIZES_SETTINGS &aSizes) override
Perform on-the-fly update of the width, via diameter & drill size from a settings class.
bool Start(const VECTOR2I &aP, ITEM *aStartItem) override
Start routing a single track at point aP, taking item aStartItem as anchor (unless NULL).
const ITEM_SET Traces() override
Return the complete routed line, as a single-member ITEM_SET.
bool m_placingVia
current via diameter
bool IsPlacingVia() const override
Function IsPlacingVia()
DIFF_PAIR_PLACER(ROUTER *aRouter)
Single track placement algorithm.
DIFF_PAIR.
void FlipPosture() override
Toggle the current posture (straight/diagonal) of the trace head.
NODE * m_currentNode
Postprocessed world state (including marked collisions & removed loops)
void updateLeadingRatLine()
Draw the "leading" ratsnest line, which connects the end of currently routed track and the nearest ye...
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).
DP_PRIMITIVE_PAIR.
void initPlacement()
Initialize placement of a new line with given parameters.
static bool FindDpPrimitivePair(NODE *aWorld, const VECTOR2I &aP, ITEM *aItem, DP_PRIMITIVE_PAIR &aPair, wxString *aErrorMsg=nullptr)
boost::optional< T > OPT
Definition: optional.h:7
bool SetLayer(int aLayer) override
Set the current routing layer.
const std::vector< int > CurrentNets() const override
Return the net code of currently routed track.
OPT< DP_PRIMITIVE_PAIR > m_prevPair
current algorithm iteration
bool tryWalkDp(NODE *aNode, DIFF_PAIR &aPair, bool aSolidsOnly)
route step, walk around mode
void SetOrthoMode(bool aOrthoMode) override
Function SetOrthoMode()
void setWorld(NODE *aWorld)
Set the board to route.
VECTOR2I m_p_start
The shove engine.
const VECTOR2I & CurrentEnd() const override
Return the current end of the line being placed.
Push and Shove diff pair dimensions (gap) settings dialog.
bool rhMarkObstacles(const VECTOR2I &aP)