KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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 The 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#include <memory>
27#include <optional>
28#include <math/box2.h>
29
31#include "pns_sizes_settings.h"
32#include "pns_node.h"
33
34namespace KIGFX
35{
36
37class VIEW;
38class VIEW_GROUP;
39
40}
41
42namespace PNS {
43
44class DEBUG_DECORATOR;
45class NODE;
46class DIFF_PAIR_PLACER;
47class PLACEMENT_ALGO;
48class LINE_PLACER;
49class ITEM;
50class ARC;
51class LINE;
52class SOLID;
53class SEGMENT;
54class JOINT;
55class VIA;
56class RULE_RESOLVER;
57class SHOVE;
58class DRAGGER;
59class DRAG_ALGO;
60class LOGGER;
61
68};
69
71{
72 DM_CORNER = 0x1,
74 DM_VIA = 0x4,
76 DM_ARC = 0x10,
77 DM_ANY = 0x17,
78 DM_COMPONENT = 0x20
79};
87 {
88 public:
90 virtual ~ROUTER_IFACE() {};
91
92 virtual void SyncWorld( NODE* aNode ) = 0;
93 virtual void AddItem( ITEM* aItem ) = 0;
94 virtual void UpdateItem( ITEM* aItem ) = 0;
95 virtual void RemoveItem( ITEM* aItem ) = 0;
96 virtual bool IsAnyLayerVisible( const PNS_LAYER_RANGE& aLayer ) const = 0;
97 virtual bool IsItemVisible( const PNS::ITEM* aItem ) const = 0;
98 virtual bool IsFlashedOnLayer( const PNS::ITEM* aItem, int aLayer ) const = 0;
99 virtual bool IsFlashedOnLayer( const PNS::ITEM* aItem, const PNS_LAYER_RANGE& aLayer ) const = 0;
100 virtual bool IsPNSCopperLayer( int aPNSLayer ) const = 0;
101 virtual void DisplayItem( const ITEM* aItem, int aClearance, bool aEdit = false,
102 int aFlags = 0 ) = 0;
103 virtual void DisplayPathLine( const SHAPE_LINE_CHAIN& aLine, int aImportance ) = 0;
104 virtual void DisplayRatline( const SHAPE_LINE_CHAIN& aRatline, NET_HANDLE aNetCode ) = 0;
105 virtual void HideItem( ITEM* aItem ) = 0;
106 virtual void Commit() = 0;
107 virtual bool ImportSizes( SIZES_SETTINGS& aSizes, ITEM* aStartItem, NET_HANDLE aNet,
108 VECTOR2D aStartPosition ) = 0;
109 virtual int StackupHeight( int aFirstLayer, int aSecondLayer ) const = 0;
110 virtual void EraseView() = 0;
111 virtual int GetNetCode( NET_HANDLE aNet ) const = 0;
112 virtual wxString GetNetName( PNS::NET_HANDLE aNet ) const = 0;
113 virtual void UpdateNet( NET_HANDLE aNet ) = 0;
115 virtual PNS::NODE* GetWorld() const = 0;
116
119
120 virtual long long int CalculateRoutedPathLength( const ITEM_SET& aLine, const SOLID* aStartPad,
121 const SOLID* aEndPad ) = 0;
122 virtual PCB_LAYER_ID GetBoardLayerFromPNSLayer( int aLayer ) const = 0;
123 virtual int GetPNSLayerFromBoardLayer( PCB_LAYER_ID aLayer ) const = 0;
124};
125
127{
128public:
130 {
135 };
136
137public:
138 ROUTER();
139 ~ROUTER();
140
141 void SetInterface( ROUTER_IFACE* aIface );
142 void SetMode ( ROUTER_MODE aMode );
143 ROUTER_MODE Mode() const { return m_mode; }
144
145 RouterState GetState() const { return m_state; }
146
147 DRAG_ALGO* GetDragger() { return m_dragger.get(); }
148
149 static ROUTER* GetInstance();
150
151 void ClearWorld();
152 void SyncWorld();
153
154 bool RoutingInProgress() const;
155 bool StartRouting( const VECTOR2I& aP, ITEM* aItem, int aLayer );
156 bool Move( const VECTOR2I& aP, ITEM* aItem );
157 bool Finish();
158 bool ContinueFromEnd( ITEM** aNewStartItem );
159 bool FixRoute( const VECTOR2I& aP, ITEM* aItem, bool aForceFinish, bool aForceCommit );
160 void BreakSegmentOrArc( ITEM *aItem, const VECTOR2I& aP );
161
162 std::optional<VECTOR2I> UndoLastSegment();
163 void CommitRouting();
164
165 void GetUpdatedItems( std::vector<PNS::ITEM*>& aRemoved, std::vector<PNS::ITEM*>& aAdded,
166 std::vector<PNS::ITEM*>& aHeads );
167
168 void StopRouting();
170
171 NODE* GetWorld() const { return m_world.get(); }
172
173 void FlipPosture();
174
175 bool SwitchLayer( int layer );
176
177 void ToggleViaPlacement();
178 void SetOrthoMode( bool aEnable );
179
180 void ToggleCornerMode();
181
182 int GetCurrentLayer() const;
183 const std::vector<NET_HANDLE> GetCurrentNets() const;
184
185 LOGGER* Logger();
186
188
189 bool IsPlacingVia() const;
190
191 const ITEM_SET QueryHoverItems( const VECTOR2I& aP, int aSlopRadius = 0 );
192
193 bool StartDragging( const VECTOR2I& aP, ITEM* aItem, int aDragMode = DM_ANY );
194 bool StartDragging( const VECTOR2I& aP, ITEM_SET aItems, int aDragMode = DM_COMPONENT );
195
196 void SetIterLimit( int aX ) { m_iterLimit = aX; }
197 int GetIterLimit() const { return m_iterLimit; };
198
200
201 void CommitRouting( NODE* aNode );
202
207 void UpdateSizes( const SIZES_SETTINGS& aSizes );
208
214 {
215 m_settings = aSettings;
216 }
217
219
220 void SetFailureReason( const wxString& aReason ) { m_failureReason = aReason; }
221 const wxString& FailureReason() const { return m_failureReason; }
222
223 PLACEMENT_ALGO* Placer() { return m_placer.get(); }
224
225 ROUTER_IFACE* GetInterface() const { return m_iface; }
226
227 void SetVisibleViewArea( const BOX2I& aExtents ) { m_visibleViewArea = aExtents; }
228 const BOX2I& VisibleViewArea() const { return m_visibleViewArea; }
229
230 std::vector<PNS::ITEM*> GetLastCommittedLeaderSegments();
231
232private:
233 bool movePlacing( const VECTOR2I& aP, ITEM* aItem );
234 bool moveDragging( const VECTOR2I& aP, ITEM* aItem );
235
236 void updateView( NODE* aNode, ITEM_SET& aCurrent, bool aDragging = false );
237
238 // optHoverItem queryHoverItemEx(const VECTOR2I& aP);
239
240 void markViolations( NODE* aNode, ITEM_SET& aCurrent, NODE::ITEM_VECTOR& aRemoved );
241 bool isStartingPointRoutable( const VECTOR2I& aWhere, ITEM* aItem, int aLayer );
242
243 bool getNearestRatnestAnchor( VECTOR2I& aOtherEnd, PNS_LAYER_RANGE& aOtherEndLayers,
244 ITEM*& aOtherEndItem );
245
246
247private:
250
251 std::unique_ptr<NODE> m_world;
253
254 std::unique_ptr<PLACEMENT_ALGO> m_placer;
255 std::unique_ptr<DRAG_ALGO> m_dragger;
256 std::unique_ptr<SHOVE> m_shove;
257 std::vector<PNS::ITEM*> m_leaderSegments;
258
260
262
267
270};
271
272}
273
274#endif
Definition: line.h:36
DRAG_ALGO.
Definition: pns_drag_algo.h:44
Base class for PNS router board items.
Definition: pns_item.h:98
Keep the router "world" - i.e.
Definition: pns_node.h:231
std::vector< ITEM * > ITEM_VECTOR
Definition: pns_node.h:242
virtual void DisplayPathLine(const SHAPE_LINE_CHAIN &aLine, int aImportance)=0
virtual int GetPNSLayerFromBoardLayer(PCB_LAYER_ID aLayer) const =0
virtual void RemoveItem(ITEM *aItem)=0
virtual void UpdateItem(ITEM *aItem)=0
virtual ~ROUTER_IFACE()
Definition: pns_router.h:90
virtual wxString GetNetName(PNS::NET_HANDLE aNet) const =0
virtual bool IsItemVisible(const PNS::ITEM *aItem) const =0
virtual void DisplayItem(const ITEM *aItem, int aClearance, bool aEdit=false, int aFlags=0)=0
virtual DEBUG_DECORATOR * GetDebugDecorator()=0
virtual void HideItem(ITEM *aItem)=0
virtual int GetNetCode(NET_HANDLE aNet) const =0
virtual bool IsPNSCopperLayer(int aPNSLayer) const =0
virtual void Commit()=0
virtual RULE_RESOLVER * GetRuleResolver()=0
virtual PCB_LAYER_ID GetBoardLayerFromPNSLayer(int aLayer) const =0
virtual void UpdateNet(NET_HANDLE aNet)=0
virtual void AddItem(ITEM *aItem)=0
virtual void DisplayRatline(const SHAPE_LINE_CHAIN &aRatline, NET_HANDLE aNetCode)=0
virtual bool ImportSizes(SIZES_SETTINGS &aSizes, ITEM *aStartItem, NET_HANDLE aNet, VECTOR2D aStartPosition)=0
virtual void EraseView()=0
virtual void SyncWorld(NODE *aNode)=0
virtual long long int CalculateRoutedPathLength(const ITEM_SET &aLine, const SOLID *aStartPad, const SOLID *aEndPad)=0
virtual bool IsFlashedOnLayer(const PNS::ITEM *aItem, int aLayer) const =0
virtual NET_HANDLE GetOrphanedNetHandle()=0
virtual int StackupHeight(int aFirstLayer, int aSecondLayer) const =0
virtual bool IsFlashedOnLayer(const PNS::ITEM *aItem, const PNS_LAYER_RANGE &aLayer) const =0
virtual bool IsAnyLayerVisible(const PNS_LAYER_RANGE &aLayer) const =0
virtual PNS::NODE * GetWorld() const =0
void updateView(NODE *aNode, ITEM_SET &aCurrent, bool aDragging=false)
Definition: pns_router.cpp:716
void SetMode(ROUTER_MODE aMode)
bool moveDragging(const VECTOR2I &aP, ITEM *aItem)
Definition: pns_router.cpp:630
bool SwitchLayer(int layer)
Definition: pns_router.cpp:973
void StopRouting()
Definition: pns_router.cpp:930
void SetIterLimit(int aX)
Definition: pns_router.h:196
void ClearViewDecorations()
Definition: pns_router.cpp:958
std::vector< PNS::ITEM * > m_leaderSegments
Definition: pns_router.h:257
void ToggleCornerMode()
int m_iterLimit
Definition: pns_router.h:261
PLACEMENT_ALGO * Placer()
Definition: pns_router.h:223
std::vector< PNS::ITEM * > GetLastCommittedLeaderSegments()
Definition: pns_router.cpp:903
NODE * m_lastNode
Definition: pns_router.h:252
void ClearWorld()
Definition: pns_router.cpp:105
ROUTER_IFACE * GetInterface() const
Definition: pns_router.h:225
void BreakSegmentOrArc(ITEM *aItem, const VECTOR2I &aP)
bool ContinueFromEnd(ITEM **aNewStartItem)
Definition: pns_router.cpp:591
void UpdateSizes(const SIZES_SETTINGS &aSizes)
Applies stored settings.
Definition: pns_router.cpp:742
void SetFailureReason(const wxString &aReason)
Definition: pns_router.h:220
LOGGER * Logger()
ROUTER_MODE Mode() const
Definition: pns_router.h:143
void LoadSettings(ROUTING_SETTINGS *aSettings)
Changes routing settings to ones passed in the parameter.
Definition: pns_router.h:213
RouterState m_state
Definition: pns_router.h:249
void CommitRouting()
Definition: pns_router.cpp:921
std::unique_ptr< DRAG_ALGO > m_dragger
Definition: pns_router.h:255
const ITEM_SET QueryHoverItems(const VECTOR2I &aP, int aSlopRadius=0)
Definition: pns_router.cpp:124
void SetInterface(ROUTER_IFACE *aIface)
const BOX2I & VisibleViewArea() const
Definition: pns_router.h:228
bool Finish()
Definition: pns_router.cpp:543
void markViolations(NODE *aNode, ITEM_SET &aCurrent, NODE::ITEM_VECTOR &aRemoved)
Definition: pns_router.cpp:644
void SyncWorld()
Definition: pns_router.cpp:95
std::unique_ptr< PLACEMENT_ALGO > m_placer
Definition: pns_router.h:254
int GetIterLimit() const
Definition: pns_router.h:197
const wxString & FailureReason() const
Definition: pns_router.h:221
bool isStartingPointRoutable(const VECTOR2I &aWhere, ITEM *aItem, int aLayer)
Definition: pns_router.cpp:219
ROUTER_IFACE * m_iface
Definition: pns_router.h:259
bool IsPlacingVia() const
void FlipPosture()
Definition: pns_router.cpp:964
RULE_RESOLVER * GetRuleResolver() const
Definition: pns_router.h:187
SIZES_SETTINGS m_sizes
Definition: pns_router.h:264
ROUTING_SETTINGS & Settings()
Definition: pns_router.h:199
DRAG_ALGO * GetDragger()
Definition: pns_router.h:147
bool movePlacing(const VECTOR2I &aP, ITEM *aItem)
Definition: pns_router.cpp:752
bool RoutingInProgress() const
Definition: pns_router.cpp:118
RouterState GetState() const
Definition: pns_router.h:145
BOX2I m_visibleViewArea
Definition: pns_router.h:248
static ROUTER * GetInstance()
Definition: pns_router.cpp:81
std::optional< VECTOR2I > UndoLastSegment()
Definition: pns_router.cpp:909
LOGGER * m_logger
Definition: pns_router.h:266
void SetOrthoMode(bool aEnable)
bool StartDragging(const VECTOR2I &aP, ITEM *aItem, int aDragMode=DM_ANY)
Definition: pns_router.cpp:157
bool StartRouting(const VECTOR2I &aP, ITEM *aItem, int aLayer)
Definition: pns_router.cpp:408
void SetVisibleViewArea(const BOX2I &aExtents)
Definition: pns_router.h:227
int GetCurrentLayer() const
bool getNearestRatnestAnchor(VECTOR2I &aOtherEnd, PNS_LAYER_RANGE &aOtherEndLayers, ITEM *&aOtherEndItem)
Definition: pns_router.cpp:492
void GetUpdatedItems(std::vector< PNS::ITEM * > &aRemoved, std::vector< PNS::ITEM * > &aAdded, std::vector< PNS::ITEM * > &aHeads)
Definition: pns_router.cpp:796
SIZES_SETTINGS & Sizes()
Definition: pns_router.h:218
std::unique_ptr< SHOVE > m_shove
Definition: pns_router.h:256
bool FixRoute(const VECTOR2I &aP, ITEM *aItem, bool aForceFinish, bool aForceCommit)
Definition: pns_router.cpp:878
std::unique_ptr< NODE > m_world
Definition: pns_router.h:251
void ToggleViaPlacement()
Definition: pns_router.cpp:982
NODE * GetWorld() const
Definition: pns_router.h:171
ROUTING_SETTINGS * m_settings
Definition: pns_router.h:263
wxString m_failureReason
Definition: pns_router.h:269
const std::vector< NET_HANDLE > GetCurrentNets() const
Definition: pns_router.cpp:995
ROUTER_MODE m_mode
Definition: pns_router.h:265
wxString m_toolStatusbarName
Definition: pns_router.h:268
bool Move(const VECTOR2I &aP, ITEM *aItem)
Definition: pns_router.cpp:468
Contain all persistent settings of the router, such as the mode, optimization effort,...
Represent a contiguous set of PCB layers.
Definition: pns_layerset.h:32
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
@ SOLID
Definition: eda_shape.h:70
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:247
Push and Shove diff pair dimensions (gap) settings dialog.
void * NET_HANDLE
Definition: pns_item.h:55
ROUTER_MODE
Definition: pns_router.h:62
@ PNS_MODE_ROUTE_SINGLE
Definition: pns_router.h:63
@ PNS_MODE_ROUTE_DIFF_PAIR
Definition: pns_router.h:64
@ PNS_MODE_TUNE_DIFF_PAIR
Definition: pns_router.h:66
@ PNS_MODE_TUNE_SINGLE
Definition: pns_router.h:65
@ PNS_MODE_TUNE_DIFF_PAIR_SKEW
Definition: pns_router.h:67
DRAG_MODE
Definition: pns_router.h:71
@ DM_CORNER
Definition: pns_router.h:72
@ DM_ANY
Definition: pns_router.h:77
@ DM_FREE_ANGLE
Definition: pns_router.h:75
@ DM_VIA
Definition: pns_router.h:74
@ DM_SEGMENT
Definition: pns_router.h:73
@ DM_ARC
Definition: pns_router.h:76
@ DM_COMPONENT
Definition: pns_router.h:78
@ VIA
Normal via.
Definition: router_tool.cpp:96