KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pns_meander.h
Go to the documentation of this file.
1/*
2 * KiRouter - a push-and-(sometimes-)shove PCB router
3 *
4 * Copyright (C) 2013-2015 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * @author Tomasz Wlostowski <[email protected]>
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_MEANDER_H
24#define __PNS_MEANDER_H
25
26#include <math/vector2d.h>
27#include <core/minoptmax.h>
28
29#include <geometry/shape.h>
31
32namespace PNS {
33
35class MEANDERED_LINE;
36
39 MT_SINGLE, // _|^|_, single-sided
40 MT_START, // _|^|
41 MT_FINISH, // |^|_
42 MT_TURN, // |^| or |_|
43 MT_CHECK_START, // try fitting a start type, but don't produce a line
44 MT_CHECK_FINISH, // try fitting a finish type, but don't produce a line
45 MT_CORNER, // line corner
46 MT_ARC, // arc corner
47 MT_EMPTY // no meander (straight line)
48};
49
52 MEANDER_STYLE_ROUND = 1, // rounded (90 degree arc)
53 MEANDER_STYLE_CHAMFER // chamfered (45 degree segment)
54};
55
63
68{
69public:
70 static const long long int DEFAULT_LENGTH_TOLERANCE;
71 static const long long int LENGTH_UNCONSTRAINED;
72
73 static const long long int DEFAULT_DELAY_TOLERANCE;
74 static const long long int DELAY_UNCONSTRAINED;
75
76 static const int SKEW_UNCONSTRAINED;
77
79
80 void SetTargetLength( long long int aOpt );
81 void SetTargetLength( const MINOPTMAX<int>& aConstraint );
82
83 void SetTargetLengthDelay( long long int aOpt );
84 void SetTargetLengthDelay( const MINOPTMAX<int>& aConstraint );
85
86 void SetTargetSkew( int aOpt );
87 void SetTargetSkew( const MINOPTMAX<int>& aConstraint );
88
89 void SetTargetSkewDelay( int aOpt );
90 void SetTargetSkewDelay( const MINOPTMAX<int>& aConstraint );
91
94
97
100
103
106
109
112
115
118
120
123
126
129
132
135
138
141
144};
145
150{
151public:
158 MEANDER_SHAPE( MEANDER_PLACER_BASE* aPlacer, int aWidth, bool aIsDual = false ) :
159 m_placer( aPlacer ),
160 m_dual( aIsDual ),
161 m_width( aWidth ),
163 {
164 // Do not leave uninitialized members, and keep static analyzer quiet:
166 m_amplitude = 0;
167 m_targetBaseLen = 0;
168 m_side = false;
169 m_baseIndex = 0;
170 m_currentTarget = nullptr;
172 }
173
177 void SetType( MEANDER_TYPE aType )
178 {
179 m_type = aType;
180 }
181
186 {
187 return m_type;
188 }
189
193 void SetBaseIndex( int aIndex )
194 {
195 m_baseIndex = aIndex;
196 }
197
201 int BaseIndex() const
202 {
203 return m_baseIndex;
204 }
205
209 int Amplitude() const
210 {
211 return m_amplitude;
212 }
213
221 void MakeCorner( const VECTOR2I& aP1, const VECTOR2I& aP2 = VECTOR2I( 0, 0 ) );
222
230 void MakeArc( const SHAPE_ARC& aArc1, const SHAPE_ARC& aArc2 = SHAPE_ARC() );
231
238 void Resize( int aAmpl );
239
243 void Recalculate();
244
248 bool IsDual() const
249 {
250 return m_dual;
251 }
252
256 bool Side() const
257 {
258 return m_side;
259 }
260
264 VECTOR2I End() const
265 {
266 return m_clippedBaseSeg.B;
267 }
268
272 const SHAPE_LINE_CHAIN& CLine( int aShape ) const
273 {
274 return m_shapes[aShape];
275 }
276
280 void MakeEmpty();
281
292 bool Fit( MEANDER_TYPE aType, const SEG& aSeg, const VECTOR2I& aP, bool aSide );
293
299 const SEG& BaseSegment() const
300 {
301 return m_clippedBaseSeg;
302 }
303
307 int BaselineLength() const;
308
312 long long int CurrentLength() const;
313
317 long long int MinTunableLength() const;
318
322 int MinAmplitude() const;
323
327 const MEANDER_SETTINGS& Settings() const;
328
332 int Width() const
333 {
334 return m_width;
335 }
336
343 void SetBaselineOffset( int aOffset )
344 {
345 m_baselineOffset = aOffset;
346 }
347
354 void SetTargetBaselineLength( int aLength ) { m_targetBaseLen = aLength; }
355
356private:
357 friend class MEANDERED_LINE;
358
360 void start( SHAPE_LINE_CHAIN* aTarget, const VECTOR2D& aWhere, const VECTOR2D& aDir );
361
363 void forward( int aLength );
364
366 void turn( const EDA_ANGLE& aAngle );
367
369 void miter( int aRadius, bool aSide );
370
372 void uShape( int aSides, int aCorner, int aTop );
373
375 SHAPE_LINE_CHAIN makeMiterShape( const VECTOR2D& aP, const VECTOR2D& aDir, bool aSide );
376
378 SHAPE_LINE_CHAIN genMeanderShape( const VECTOR2D& aP, const VECTOR2D& aDir, bool aSide,
379 MEANDER_TYPE aType, int aBaselineOffset = 0 );
380
382 void updateBaseSegment();
383
385 int cornerRadius() const;
386
388 int spacing() const;
389
392
395
397 bool m_dual;
398
401
404
407
410
413
416
419
422
424 bool m_side;
425
428
431
434
437
440};
441
442
447{
448public:
450 {
451 // Do not leave uninitialized members, and keep static analyzer quiet:
452 m_placer = nullptr;
453 m_dual = false;
454 m_width = 0;
456 }
457
462 MEANDERED_LINE( MEANDER_PLACER_BASE* aPlacer, bool aIsDual = false ) :
463 m_placer( aPlacer ),
464 m_dual( aIsDual )
465 {
466 // Do not leave uninitialized members, and keep static analyzer quiet:
467 m_width = 0;
469 }
470
472 {
473 Clear();
474 }
475
483 void AddCorner( const VECTOR2I& aA, const VECTOR2I& aB = VECTOR2I( 0, 0 ) );
484
492 void AddArc( const SHAPE_ARC& aArc1, const SHAPE_ARC& aArc2 = SHAPE_ARC() );
493
501 void AddArcAndPt( const SHAPE_ARC& aArc1, const VECTOR2I& aPt2 );
502
510 void AddPtAndArc( const VECTOR2I& aPt1, const SHAPE_ARC& aArc2 );
511
517 void AddMeander( MEANDER_SHAPE* aShape );
518
522 void Clear();
523
527 void SetWidth( int aWidth )
528 {
529 m_width = aWidth;
530 }
531
539 void MeanderSegment( const SEG& aSeg, bool aSide, int aBaseIndex = 0 );
540
542 void SetBaselineOffset( int aOffset )
543 {
544 m_baselineOffset = aOffset;
545 }
546
550 std::vector<MEANDER_SHAPE*>& Meanders()
551 {
552 return m_meanders;
553 }
554
562 bool CheckSelfIntersections( MEANDER_SHAPE* aShape, int aClearance );
563
567 const MEANDER_SETTINGS& Settings() const;
568
569private:
571
573 std::vector<MEANDER_SHAPE*> m_meanders;
574
575 bool m_dual;
578};
579
580}
581
582#endif // __PNS_MEANDER_H
A collection of nets and the parameters used to route or test these nets.
Definition netclass.h:45
Represent a set of meanders fitted over a single or two lines.
void AddMeander(MEANDER_SHAPE *aShape)
Add a new meander shape to the meandered line.
MEANDER_PLACER_BASE * m_placer
void SetBaselineOffset(int aOffset)
Set the parallel offset between the base segment and the meandered line.
void SetWidth(int aWidth)
Set the line width.
void AddCorner(const VECTOR2I &aA, const VECTOR2I &aB=VECTOR2I(0, 0))
Create a dummy meander shape representing a line corner.
void Clear()
Clear the line geometry, removing all corners and meanders.
std::vector< MEANDER_SHAPE * > m_meanders
void MeanderSegment(const SEG &aSeg, bool aSide, int aBaseIndex=0)
Fit maximum amplitude meanders on a given segment and adds to the current line.
void AddArc(const SHAPE_ARC &aArc1, const SHAPE_ARC &aArc2=SHAPE_ARC())
Create a dummy meander shape representing an arc corner.
void AddArcAndPt(const SHAPE_ARC &aArc1, const VECTOR2I &aPt2)
Create a dummy meander shape representing an arc corner.
bool CheckSelfIntersections(MEANDER_SHAPE *aShape, int aClearance)
Check if the given shape is intersecting with any other meander in the current line.
const MEANDER_SETTINGS & Settings() const
MEANDERED_LINE(MEANDER_PLACER_BASE *aPlacer, bool aIsDual=false)
std::vector< MEANDER_SHAPE * > & Meanders()
void AddPtAndArc(const VECTOR2I &aPt1, const SHAPE_ARC &aArc2)
Create a dummy meander shape representing an arc corner.
Base class for Single trace & Differential pair meandering tools, as both of them share a lot of code...
Dimensions for the meandering algorithm.
Definition pns_meander.h:68
int m_minAmplitude
Maximum meandering amplitude.
Definition pns_meander.h:93
void SetTargetLength(long long int aOpt)
bool m_isTimeDomain
The net class this meander pattern belongs to.
static const long long int LENGTH_UNCONSTRAINED
Definition pns_meander.h:71
int m_cornerRadiusPercentage
Place meanders on one side.
MEANDER_SIDE m_initialSide
Allowable tuning error.
bool m_singleSided
Initial side when placing meanders at segment.
void SetTargetLengthDelay(long long int aOpt)
static const int SKEW_UNCONSTRAINED
Definition pns_meander.h:76
static const long long int DEFAULT_DELAY_TOLERANCE
Definition pns_meander.h:73
MINOPTMAX< long long int > m_targetLength
Desired propagation delay of the tuned line.
void SetTargetSkew(int aOpt)
static const long long int DEFAULT_LENGTH_TOLERANCE
Definition pns_meander.h:70
int m_lengthTolerance
Keep vertices between pre, tuned and post parts of the line.
int m_step
Length PadToDie.
MINOPTMAX< int > m_targetSkew
Target skew value for diff pair de-skewing.
MEANDER_STYLE m_cornerStyle
Rounding percentage (0 - 100).
bool m_keepEndpoints
Calculate tuning in the time domain.
MINOPTMAX< int > m_targetSkewDelay
int m_maxAmplitude
Meandering period/spacing (see dialog picture for explanation).
Definition pns_meander.h:96
bool m_overrideCustomRules
Type of corners for the meandered line.
MINOPTMAX< long long int > m_targetLengthDelay
Target skew value for diff pair de-skewing.
void SetTargetSkewDelay(int aOpt)
static const long long int DELAY_UNCONSTRAINED
Definition pns_meander.h:74
int m_lenPadToDie
Desired length of the tuned line/diff pair (this is in nm, so allow more than board width).
int m_spacing
Amplitude/spacing adjustment step.
Definition pns_meander.h:99
The geometry of a single meander.
MEANDER_TYPE m_type
The placer that placed this meander.
int MinAmplitude() const
MEANDER_PLACER_BASE * m_placer
Dual or single line.
SEG m_baseSeg
Base segment (clipped).
MEANDER_SHAPE(MEANDER_PLACER_BASE *aPlacer, int aWidth, bool aIsDual=false)
SEG m_clippedBaseSeg
Side (true = right).
int Amplitude() const
void SetType(MEANDER_TYPE aType)
Set the type of the meander.
int m_targetBaseLen
First point of the meandered line.
VECTOR2I End() const
SHAPE_LINE_CHAIN genMeanderShape(const VECTOR2D &aP, const VECTOR2D &aDir, bool aSide, MEANDER_TYPE aType, int aBaselineOffset=0)
Recalculate the clipped baseline after the parameters of the meander have been changed.
void start(SHAPE_LINE_CHAIN *aTarget, const VECTOR2D &aWhere, const VECTOR2D &aDir)
Move turtle forward by aLength.
void SetBaseIndex(int aIndex)
Set an auxiliary index of the segment being meandered in its original LINE.
int m_baselineOffset
Average radius of meander corners (for correction of DP meanders).
VECTOR2D m_currentDir
The current turtle position.
int m_width
Amplitude of the meander.
int BaseIndex() const
VECTOR2D m_currentPos
The line the turtle is drawing on.
SHAPE_LINE_CHAIN m_shapes[2]
Index of the meandered segment in the base line.
long long int CurrentLength() const
bool m_side
The actual shapes (0 used for single, both for dual).
bool Side() const
void updateBaseSegment()
Return sanitized corner radius value.
SHAPE_LINE_CHAIN makeMiterShape(const VECTOR2D &aP, const VECTOR2D &aDir, bool aSide)
Produce a meander shape of given type.
void MakeArc(const SHAPE_ARC &aArc1, const SHAPE_ARC &aArc2=SHAPE_ARC())
Create a dummy meander shape representing an arc corner.
void SetTargetBaselineLength(int aLength)
Sets the target length of the baseline.
int m_baseIndex
The current turtle direction.
SHAPE_LINE_CHAIN * m_currentTarget
bool m_dual
Width of the line.
void Recalculate()
Recalculate the line chain representing the meander's shape.
void miter(int aRadius, bool aSide)
Tell the turtle to draw an U-like shape.
long long int MinTunableLength() const
void Resize(int aAmpl)
Change the amplitude of the meander shape to aAmpl and recalculates the resulting line chain.
int m_meanCornerRadius
Minimum length of the base segment to target when resizing.
int Width() const
int spacing() const
The type of meander.
bool IsDual() const
friend class MEANDERED_LINE
Start turtle drawing.
int m_amplitude
Offset wrs the base segment (dual only).
int cornerRadius() const
Return sanitized spacing value.
void turn(const EDA_ANGLE &aAngle)
Tell the turtle to draw a mitered corner of given radius and turn direction.
void SetBaselineOffset(int aOffset)
Set the parallel offset between the base segment and the meandered line.
void forward(int aLength)
Turn the turtle by aAngle.
MEANDER_TYPE Type() const
VECTOR2I m_p0
Base segment (unclipped).
const MEANDER_SETTINGS & Settings() const
void MakeEmpty()
Replace the meander with straight bypass line(s), effectively clearing it.
bool Fit(MEANDER_TYPE aType, const SEG &aSeg, const VECTOR2I &aP, bool aSide)
Attempt to fit a meander of a given type onto a segment, avoiding collisions with other board feature...
void uShape(int aSides, int aCorner, int aTop)
Generate a 90-degree circular arc.
const SHAPE_LINE_CHAIN & CLine(int aShape) const
int BaselineLength() const
const SEG & BaseSegment() const
Return the base segment the meander was fitted to.
void MakeCorner(const VECTOR2I &aP1, const VECTOR2I &aP2=VECTOR2I(0, 0))
Create a dummy meander shape representing a line corner.
Definition seg.h:42
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Push and Shove diff pair dimensions (gap) settings dialog.
MEANDER_TYPE
Shapes of available meanders.
Definition pns_meander.h:38
@ MT_ARC
Definition pns_meander.h:46
@ MT_TURN
Definition pns_meander.h:42
@ MT_CHECK_START
Definition pns_meander.h:43
@ MT_CHECK_FINISH
Definition pns_meander.h:44
@ MT_START
Definition pns_meander.h:40
@ MT_FINISH
Definition pns_meander.h:41
@ MT_EMPTY
Definition pns_meander.h:47
@ MT_CORNER
Definition pns_meander.h:45
@ MT_SINGLE
Definition pns_meander.h:39
MEANDER_SIDE
Definition pns_meander.h:58
@ MEANDER_SIDE_RIGHT
Definition pns_meander.h:61
@ MEANDER_SIDE_DEFAULT
Definition pns_meander.h:60
@ MEANDER_SIDE_LEFT
Definition pns_meander.h:59
MEANDER_STYLE
Definition pns_meander.h:51
@ MEANDER_STYLE_ROUND
Definition pns_meander.h:52
@ MEANDER_STYLE_CHAMFER
Definition pns_meander.h:53
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
VECTOR2< double > VECTOR2D
Definition vector2d.h:694