KiCad PCB EDA Suite
pns_router.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 KiCad Developers, see AUTHORS.txt for contributors.
6  * Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
7  *
8  * This program is free software: you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation, either version 3 of the License, or (at your
11  * option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program. If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #ifndef __PNS_ROUTER_H
23 #define __PNS_ROUTER_H
24 
25 #include <list>
26 
27 #include <memory>
28 #include <core/optional.h>
29 
32 #include <math/box2.h>
33 
34 #include "pns_routing_settings.h"
35 #include "pns_sizes_settings.h"
36 #include "pns_item.h"
37 #include "pns_itemset.h"
38 #include "pns_node.h"
39 
40 namespace KIGFX
41 {
42 
43 class VIEW;
44 class VIEW_GROUP;
45 
46 }
47 
48 namespace PNS {
49 
50 class DEBUG_DECORATOR;
51 class NODE;
52 class DIFF_PAIR_PLACER;
53 class PLACEMENT_ALGO;
54 class LINE_PLACER;
55 class ITEM;
56 class ARC;
57 class LINE;
58 class SOLID;
59 class SEGMENT;
60 class JOINT;
61 class VIA;
62 class RULE_RESOLVER;
63 class SHOVE;
64 class DRAGGER;
65 class DRAG_ALGO;
66 class LOGGER;
67 
74 };
75 
77 {
78  DM_CORNER = 0x1,
79  DM_SEGMENT = 0x2,
80  DM_VIA = 0x4,
82  DM_ARC = 0x10,
83  DM_ANY = 0x17,
84  DM_COMPONENT = 0x20
85 };
93  {
94  public:
96  virtual ~ROUTER_IFACE() {};
97 
98  virtual void SyncWorld( NODE* aNode ) = 0;
99  virtual void AddItem( ITEM* aItem ) = 0;
100  virtual void UpdateItem( ITEM* aItem ) = 0;
101  virtual void RemoveItem( ITEM* aItem ) = 0;
102  virtual bool IsAnyLayerVisible( const LAYER_RANGE& aLayer ) const = 0;
103  virtual bool IsItemVisible( const PNS::ITEM* aItem ) const = 0;
104  virtual bool IsFlashedOnLayer( const PNS::ITEM* aItem, int aLayer ) const = 0;
105  virtual void DisplayItem( const ITEM* aItem, int aClearance, bool aEdit = false ) = 0;
106  virtual void DisplayRatline( const SHAPE_LINE_CHAIN& aRatline, int aColor = -1 ) = 0;
107  virtual void HideItem( ITEM* aItem ) = 0;
108  virtual void Commit() = 0;
109  virtual bool ImportSizes( SIZES_SETTINGS& aSizes, ITEM* aStartItem, int aNet ) = 0;
110 
111  virtual void EraseView() = 0;
112  virtual void UpdateNet( int aNetCode ) = 0;
113 
114  virtual PNS::NODE* GetWorld() const = 0;
115 
116  virtual RULE_RESOLVER* GetRuleResolver() = 0;
117  virtual DEBUG_DECORATOR* GetDebugDecorator() = 0;
118 };
119 
120 class ROUTER
121 {
122 public:
124  {
128  };
129 
130 public:
131  ROUTER();
132  ~ROUTER();
133 
134  void SetInterface( ROUTER_IFACE* aIface );
135  void SetMode ( ROUTER_MODE aMode );
136  ROUTER_MODE Mode() const { return m_mode; }
137 
138  RouterState GetState() const { return m_state; }
139 
140  DRAG_ALGO* GetDragger() { return m_dragger.get(); }
141 
142  static ROUTER* GetInstance();
143 
144  void ClearWorld();
145  void SyncWorld();
146 
147  bool RoutingInProgress() const;
148  bool StartRouting( const VECTOR2I& aP, ITEM* aItem, int aLayer );
149  void Move( const VECTOR2I& aP, ITEM* aItem );
150  bool FixRoute( const VECTOR2I& aP, ITEM* aItem, bool aForceFinish = false );
151  void BreakSegment( ITEM *aItem, const VECTOR2I& aP );
152 
153  void UndoLastSegment();
154  void CommitRouting();
155  void StopRouting();
156  void ClearViewDecorations();
157 
158  NODE* GetWorld() const { return m_world.get(); }
159 
160  void FlipPosture();
161 
162  bool SwitchLayer( int layer );
163 
164  void ToggleViaPlacement();
165  void SetOrthoMode( bool aEnable );
166 
167  void ToggleRounded();
168 
169  int GetCurrentLayer() const;
170  const std::vector<int> GetCurrentNets() const;
171 
172  LOGGER* Logger();
173 
175  {
176  return m_iface->GetRuleResolver();
177  }
178 
179  bool IsPlacingVia() const;
180 
181  const ITEM_SET QueryHoverItems( const VECTOR2I& aP );
182 
183  bool StartDragging( const VECTOR2I& aP, ITEM* aItem, int aDragMode = DM_ANY );
184  bool StartDragging( const VECTOR2I& aP, ITEM_SET aItems, int aDragMode = DM_COMPONENT );
185 
186  void SetIterLimit( int aX ) { m_iterLimit = aX; }
187  int GetIterLimit() const { return m_iterLimit; };
188 
190 
191  void CommitRouting( NODE* aNode );
192 
197  void UpdateSizes( const SIZES_SETTINGS& aSizes );
198 
203  void LoadSettings( ROUTING_SETTINGS* aSettings )
204  {
205  m_settings = aSettings;
206  }
207 
208  SIZES_SETTINGS& Sizes() { return m_sizes; }
209 
210  void SetFailureReason( const wxString& aReason ) { m_failureReason = aReason; }
211  const wxString& FailureReason() const { return m_failureReason; }
212 
213  PLACEMENT_ALGO* Placer() { return m_placer.get(); }
214 
216  {
217  return m_iface;
218  }
219 
220  void SetVisibleViewArea( const BOX2I& aExtents )
221  {
222  m_visibleViewArea = aExtents;
223  }
224 
225  const BOX2I& VisibleViewArea() const
226  {
227  return m_visibleViewArea;
228  }
229 
230 private:
231  void movePlacing( const VECTOR2I& aP, ITEM* aItem );
232  void moveDragging( const VECTOR2I& aP, ITEM* aItem );
233 
234  void updateView( NODE* aNode, ITEM_SET& aCurrent, bool aDragging = false );
235 
236  // optHoverItem queryHoverItemEx(const VECTOR2I& aP);
237 
238  void markViolations( NODE* aNode, ITEM_SET& aCurrent, NODE::ITEM_VECTOR& aRemoved );
239  bool isStartingPointRoutable( const VECTOR2I& aWhere, ITEM* aItem, int aLayer );
240 
244 
245  std::unique_ptr<NODE> m_world;
247 
248  std::unique_ptr<PLACEMENT_ALGO> m_placer;
249  std::unique_ptr<DRAG_ALGO> m_dragger;
250  std::unique_ptr<SHOVE> m_shove;
251 
253 
256 
261 
263  wxString m_failureReason;
264 };
265 
266 }
267 
268 #endif
const wxString & FailureReason() const
Definition: pns_router.h:211
Base class for PNS router board items.
Definition: pns_item.h:55
Contain all persistent settings of the router, such as the mode, optimization effort,...
DRAG_MODE
Definition: pns_router.h:76
Definition: track.h:343
void moveDragging(const VECTOR2I &aP, ITEM *aItem)
Definition: pns_router.cpp:420
Keep the router "world" - i.e.
Definition: pns_node.h:149
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:175
virtual RULE_RESOLVER * GetRuleResolver()=0
const ITEM_SET QueryHoverItems(const VECTOR2I &aP)
Definition: pns_router.cpp:120
void CommitRouting()
Definition: pns_router.cpp:655
DRAG_ALGO.
Definition: pns_drag_algo.h:42
virtual PNS::NODE * GetWorld() const =0
RULE_RESOLVER * GetRuleResolver() const
Definition: pns_router.h:174
void ClearViewDecorations()
Definition: pns_router.cpp:692
PLACEMENT_ALGO * Placer()
Definition: pns_router.h:213
virtual void HideItem(ITEM *aItem)=0
bool isStartingPointRoutable(const VECTOR2I &aWhere, ITEM *aItem, int aLayer)
Definition: pns_router.cpp:183
void SyncWorld()
Definition: pns_router.cpp:93
bool IsPlacingVia() const
Definition: pns_router.cpp:754
void ToggleRounded()
Definition: pns_router.cpp:763
std::unique_ptr< PLACEMENT_ALGO > m_placer
Definition: pns_router.h:248
BOX2I m_visibleViewArea
Definition: pns_router.h:241
const std::vector< int > GetCurrentNets() const
Definition: pns_router.cpp:726
VECTOR2I m_currentEnd
Definition: pns_router.h:242
int m_iterLimit
Definition: pns_router.h:254
virtual void DisplayRatline(const SHAPE_LINE_CHAIN &aRatline, int aColor=-1)=0
ROUTING_SETTINGS * m_settings
Definition: pns_router.h:257
virtual void AddItem(ITEM *aItem)=0
SIZES_SETTINGS & Sizes()
Definition: pns_router.h:208
std::unique_ptr< SHOVE > m_shove
Definition: pns_router.h:250
void SetOrthoMode(bool aEnable)
Definition: pns_router.cpp:781
void ToggleViaPlacement()
Definition: pns_router.cpp:716
std::unique_ptr< NODE > m_world
Definition: pns_router.h:245
void ClearWorld()
Definition: pns_router.cpp:102
std::unique_ptr< DRAG_ALGO > m_dragger
Definition: pns_router.h:249
virtual bool IsAnyLayerVisible(const LAYER_RANGE &aLayer) const =0
virtual ~ROUTER_IFACE()
Definition: pns_router.h:96
wxString m_toolStatusbarName
Definition: pns_router.h:262
void UndoLastSegment()
Definition: pns_router.cpp:646
virtual void SyncWorld(NODE *aNode)=0
virtual void DisplayItem(const ITEM *aItem, int aClearance, bool aEdit=false)=0
virtual void UpdateNet(int aNetCode)=0
void BreakSegment(ITEM *aItem, const VECTOR2I &aP)
Definition: pns_router.cpp:801
void updateView(NODE *aNode, ITEM_SET &aCurrent, bool aDragging=false)
Definition: pns_router.cpp:502
NODE * m_lastNode
Definition: pns_router.h:246
virtual bool IsItemVisible(const PNS::ITEM *aItem) const =0
bool FixRoute(const VECTOR2I &aP, ITEM *aItem, bool aForceFinish=false)
Definition: pns_router.cpp:621
void SetVisibleViewArea(const BOX2I &aExtents)
Definition: pns_router.h:220
void SetFailureReason(const wxString &aReason)
Definition: pns_router.h:210
RouterState m_state
Definition: pns_router.h:243
ROUTER_IFACE * m_iface
Definition: pns_router.h:252
void movePlacing(const VECTOR2I &aP, ITEM *aItem)
Definition: pns_router.cpp:538
const BOX2I & VisibleViewArea() const
Definition: pns_router.h:225
void Move(const VECTOR2I &aP, ITEM *aItem)
Definition: pns_router.cpp:397
bool StartRouting(const VECTOR2I &aP, ITEM *aItem, int aLayer)
Definition: pns_router.cpp:342
void SetIterLimit(int aX)
Definition: pns_router.h:186
void SetInterface(ROUTER_IFACE *aIface)
Definition: pns_router.cpp:796
virtual void UpdateItem(ITEM *aItem)=0
void StopRouting()
Definition: pns_router.cpp:664
virtual void EraseView()=0
LOGGER * m_logger
Definition: pns_router.h:260
virtual DEBUG_DECORATOR * GetDebugDecorator()=0
ROUTER_MODE
Definition: pns_router.h:68
virtual bool IsFlashedOnLayer(const PNS::ITEM *aItem, int aLayer) const =0
void UpdateSizes(const SIZES_SETTINGS &aSizes)
Applies stored settings.
Definition: pns_router.cpp:526
void SetMode(ROUTER_MODE aMode)
Definition: pns_router.cpp:790
Board layer functions and definitions.
Definition: track.h:262
SHAPE_LINE_CHAIN.
LOGGER * Logger()
Definition: pns_router.cpp:748
DRAG_ALGO * GetDragger()
Definition: pns_router.h:140
bool StartDragging(const VECTOR2I &aP, ITEM *aItem, int aDragMode=DM_ANY)
Definition: pns_router.cpp:129
bool SwitchLayer(int layer)
Definition: pns_router.cpp:707
SIZES_SETTINGS m_sizes
Definition: pns_router.h:258
virtual void Commit()=0
int GetIterLimit() const
Definition: pns_router.h:187
void LoadSettings(ROUTING_SETTINGS *aSettings)
Changes routing settings to ones passed in the parameter.
Definition: pns_router.h:203
virtual void RemoveItem(ITEM *aItem)=0
ROUTER_MODE m_mode
Definition: pns_router.h:259
void FlipPosture()
Definition: pns_router.cpp:698
bool RoutingInProgress() const
Definition: pns_router.cpp:114
ROUTER_MODE Mode() const
Definition: pns_router.h:136
Push and Shove diff pair dimensions (gap) settings dialog.
NODE * GetWorld() const
Definition: pns_router.h:158
ROUTING_SETTINGS & Settings()
Definition: pns_router.h:189
RouterState GetState() const
Definition: pns_router.h:138
virtual bool ImportSizes(SIZES_SETTINGS &aSizes, ITEM *aStartItem, int aNet)=0
ROUTER_IFACE * GetInterface() const
Definition: pns_router.h:215
static ROUTER * GetInstance()
Definition: pns_router.cpp:79
Represent a contiguous set of PCB layers.
Definition: pns_layerset.h:31
bool m_forceMarkObstaclesMode
Definition: pns_router.h:255
wxString m_failureReason
Definition: pns_router.h:263
std::vector< ITEM * > ITEM_VECTOR
Definition: pns_node.h:153
void markViolations(NODE *aNode, ITEM_SET &aCurrent, NODE::ITEM_VECTOR &aRemoved)
Definition: pns_router.cpp:431
int GetCurrentLayer() const
Definition: pns_router.cpp:737