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
32class NETCLASS;
33
34namespace PNS {
35
37class MEANDERED_LINE;
38
41 MT_SINGLE, // _|^|_, single-sided
42 MT_START, // _|^|
43 MT_FINISH, // |^|_
44 MT_TURN, // |^| or |_|
45 MT_CHECK_START, // try fitting a start type, but don't produce a line
46 MT_CHECK_FINISH, // try fitting a finish type, but don't produce a line
47 MT_CORNER, // line corner
48 MT_ARC, // arc corner
49 MT_EMPTY // no meander (straight line)
50};
51
54 MEANDER_STYLE_ROUND = 1, // rounded (90 degree arc)
55 MEANDER_STYLE_CHAMFER // chamfered (45 degree segment)
56};
57
65
70{
71public:
72 static const long long int DEFAULT_LENGTH_TOLERANCE;
73 static const long long int LENGTH_UNCONSTRAINED;
74
75 static const long long int DEFAULT_DELAY_TOLERANCE;
76 static const long long int DELAY_UNCONSTRAINED;
77
78 static const int SKEW_UNCONSTRAINED;
79
81
82 void SetTargetLength( long long int aOpt );
83 void SetTargetLength( const MINOPTMAX<int>& aConstraint );
84
85 void SetTargetLengthDelay( long long int aOpt );
86 void SetTargetLengthDelay( const MINOPTMAX<int>& aConstraint );
87
88 void SetTargetSkew( int aOpt );
89 void SetTargetSkew( const MINOPTMAX<int>& aConstraint );
90
91 void SetTargetSkewDelay( int aOpt );
92 void SetTargetSkewDelay( const MINOPTMAX<int>& aConstraint );
93
96
99
102
105
108
111
114
117
120
122
125
128
131
134
137
140
143
146};
147
152{
153public:
160 MEANDER_SHAPE( MEANDER_PLACER_BASE* aPlacer, int aWidth, bool aIsDual = false ) :
161 m_placer( aPlacer ),
162 m_dual( aIsDual ),
163 m_width( aWidth ),
165 {
166 // Do not leave uninitialized members, and keep static analyzer quiet:
168 m_amplitude = 0;
169 m_targetBaseLen = 0;
170 m_side = false;
171 m_baseIndex = 0;
172 m_currentTarget = nullptr;
174 }
175
179 void SetType( MEANDER_TYPE aType )
180 {
181 m_type = aType;
182 }
183
188 {
189 return m_type;
190 }
191
195 void SetBaseIndex( int aIndex )
196 {
197 m_baseIndex = aIndex;
198 }
199
203 int BaseIndex() const
204 {
205 return m_baseIndex;
206 }
207
211 int Amplitude() const
212 {
213 return m_amplitude;
214 }
215
223 void MakeCorner( const VECTOR2I& aP1, const VECTOR2I& aP2 = VECTOR2I( 0, 0 ) );
224
232 void MakeArc( const SHAPE_ARC& aArc1, const SHAPE_ARC& aArc2 = SHAPE_ARC() );
233
240 void Resize( int aAmpl );
241
245 void Recalculate();
246
250 bool IsDual() const
251 {
252 return m_dual;
253 }
254
258 bool Side() const
259 {
260 return m_side;
261 }
262
266 VECTOR2I End() const
267 {
268 return m_clippedBaseSeg.B;
269 }
270
274 const SHAPE_LINE_CHAIN& CLine( int aShape ) const
275 {
276 return m_shapes[aShape];
277 }
278
282 void MakeEmpty();
283
294 bool Fit( MEANDER_TYPE aType, const SEG& aSeg, const VECTOR2I& aP, bool aSide );
295
301 const SEG& BaseSegment() const
302 {
303 return m_clippedBaseSeg;
304 }
305
309 int BaselineLength() const;
310
314 long long int CurrentLength() const;
315
319 long long int MinTunableLength() const;
320
324 int MinAmplitude() const;
325
329 const MEANDER_SETTINGS& Settings() const;
330
334 int Width() const
335 {
336 return m_width;
337 }
338
345 void SetBaselineOffset( int aOffset )
346 {
347 m_baselineOffset = aOffset;
348 }
349
356 void SetTargetBaselineLength( int aLength ) { m_targetBaseLen = aLength; }
357
358private:
359 friend class MEANDERED_LINE;
360
362 void start( SHAPE_LINE_CHAIN* aTarget, const VECTOR2D& aWhere, const VECTOR2D& aDir );
363
365 void forward( int aLength );
366
368 void turn( const EDA_ANGLE& aAngle );
369
371 void miter( int aRadius, bool aSide );
372
374 void uShape( int aSides, int aCorner, int aTop );
375
377 SHAPE_LINE_CHAIN makeMiterShape( const VECTOR2D& aP, const VECTOR2D& aDir, bool aSide );
378
380 SHAPE_LINE_CHAIN genMeanderShape( const VECTOR2D& aP, const VECTOR2D& aDir, bool aSide,
381 MEANDER_TYPE aType, int aBaselineOffset = 0 );
382
384 void updateBaseSegment();
385
387 int cornerRadius() const;
388
390 int spacing() const;
391
394
397
399 bool m_dual;
400
403
406
409
412
415
418
421
424
426 bool m_side;
427
430
433
436
439
442};
443
444
449{
450public:
452 {
453 // Do not leave uninitialized members, and keep static analyzer quiet:
454 m_placer = nullptr;
455 m_dual = false;
456 m_width = 0;
458 }
459
464 MEANDERED_LINE( MEANDER_PLACER_BASE* aPlacer, bool aIsDual = false ) :
465 m_placer( aPlacer ),
466 m_dual( aIsDual )
467 {
468 // Do not leave uninitialized members, and keep static analyzer quiet:
469 m_width = 0;
471 }
472
474 {
475 Clear();
476 }
477
485 void AddCorner( const VECTOR2I& aA, const VECTOR2I& aB = VECTOR2I( 0, 0 ) );
486
494 void AddArc( const SHAPE_ARC& aArc1, const SHAPE_ARC& aArc2 = SHAPE_ARC() );
495
503 void AddArcAndPt( const SHAPE_ARC& aArc1, const VECTOR2I& aPt2 );
504
512 void AddPtAndArc( const VECTOR2I& aPt1, const SHAPE_ARC& aArc2 );
513
519 void AddMeander( MEANDER_SHAPE* aShape );
520
524 void Clear();
525
529 void SetWidth( int aWidth )
530 {
531 m_width = aWidth;
532 }
533
541 void MeanderSegment( const SEG& aSeg, bool aSide, int aBaseIndex = 0 );
542
544 void SetBaselineOffset( int aOffset )
545 {
546 m_baselineOffset = aOffset;
547 }
548
552 std::vector<MEANDER_SHAPE*>& Meanders()
553 {
554 return m_meanders;
555 }
556
564 bool CheckSelfIntersections( MEANDER_SHAPE* aShape, int aClearance );
565
569 const MEANDER_SETTINGS& Settings() const;
570
571 // Move assignment operator
573 {
574 if (this != &aOther)
575 {
576 m_last = aOther.m_last;
577
578 m_placer = aOther.m_placer;
579 m_meanders = std::move( aOther.m_meanders );
580
581 m_dual = aOther.m_dual;
582 m_width = aOther.m_width;
583 m_baselineOffset = aOther.m_baselineOffset;
584 }
585
586 return *this;
587 }
588
589private:
591
593 std::vector<MEANDER_SHAPE*> m_meanders;
594
595 bool m_dual;
598};
599
600}
601
602#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.
MEANDERED_LINE & operator=(MEANDERED_LINE &&aOther) noexcept
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:70
int m_minAmplitude
Maximum meandering amplitude.
Definition pns_meander.h:95
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:73
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:78
static const long long int DEFAULT_DELAY_TOLERANCE
Definition pns_meander.h:75
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:72
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:98
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:76
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.
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:40
@ MT_ARC
Definition pns_meander.h:48
@ MT_TURN
Definition pns_meander.h:44
@ MT_CHECK_START
Definition pns_meander.h:45
@ MT_CHECK_FINISH
Definition pns_meander.h:46
@ MT_START
Definition pns_meander.h:42
@ MT_FINISH
Definition pns_meander.h:43
@ MT_EMPTY
Definition pns_meander.h:49
@ MT_CORNER
Definition pns_meander.h:47
@ MT_SINGLE
Definition pns_meander.h:41
MEANDER_SIDE
Definition pns_meander.h:60
@ MEANDER_SIDE_RIGHT
Definition pns_meander.h:63
@ MEANDER_SIDE_DEFAULT
Definition pns_meander.h:62
@ MEANDER_SIDE_LEFT
Definition pns_meander.h:61
MEANDER_STYLE
Definition pns_meander.h:53
@ MEANDER_STYLE_ROUND
Definition pns_meander.h:54
@ MEANDER_STYLE_CHAMFER
Definition pns_meander.h:55
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
VECTOR2< double > VECTOR2D
Definition vector2d.h:694