KiCad PCB EDA Suite
PNS::DIFF_PAIR Class Reference

Class DIFF_PAIR. More...

#include <pns_diff_pair.h>

Inheritance diagram for PNS::DIFF_PAIR:
PNS::ITEM

Classes

struct  COUPLED_SEGMENTS
 

Public Types

typedef std::vector< COUPLED_SEGMENTSCOUPLED_SEGMENTS_VEC
 
enum  PnsKind {
  SOLID_T = 1, LINE_T = 2, JOINT_T = 4, SEGMENT_T = 8,
  VIA_T = 16, DIFF_PAIR_T = 32, ANY_T = 0xff
}
 

Supported item types

More...
 

Public Member Functions

 DIFF_PAIR ()
 
 DIFF_PAIR (int aGap)
 
 DIFF_PAIR (const SHAPE_LINE_CHAIN &aP, const SHAPE_LINE_CHAIN &aN, int aGap=0)
 
 DIFF_PAIR (const LINE &aLineP, const LINE &aLineN, int aGap=0)
 
DIFF_PAIRClone () const override
 Function Clone() More...
 
void SetShape (const SHAPE_LINE_CHAIN &aP, const SHAPE_LINE_CHAIN &aN, bool aSwapLanes=false)
 
void SetShape (const DIFF_PAIR &aPair)
 
void SetNets (int aP, int aN)
 
void SetWidth (int aWidth)
 
int Width () const
 
void SetGap (int aGap)
 
int Gap () const
 
void AppendVias (const VIA &aViaP, const VIA &aViaN)
 
void RemoveVias ()
 
bool EndsWithVias () const
 
int NetP () const
 
int NetN () const
 
LINEPLine ()
 
LINENLine ()
 
DP_PRIMITIVE_PAIR EndingPrimitives ()
 
double CoupledLength () const
 
double TotalLength () const
 
double CoupledLengthFactor () const
 
double Skew () const
 
void CoupledSegmentPairs (COUPLED_SEGMENTS_VEC &aPairs) const
 
void Clear ()
 
void Append (const DIFF_PAIR &aOther)
 
bool Empty () const
 
const SHAPE_LINE_CHAINCP () const
 
const SHAPE_LINE_CHAINCN () const
 
bool BuildInitial (const DP_GATEWAY &aEntry, const DP_GATEWAY &aTarget, bool aPrefDiagonal)
 
bool CheckConnectionAngle (const DIFF_PAIR &aOther, int allowedAngles) const
 
int CoupledLength (const SEG &aP, const SEG &aN) const
 
int64_t CoupledLength (const SHAPE_LINE_CHAIN &aP, const SHAPE_LINE_CHAIN &aN) const
 
const RANGED_NUM< int > GapConstraint () const
 
virtual const SHAPE_LINE_CHAIN Hull (int aClearance=0, int aWalkaroundThickness=0) const
 
PnsKind Kind () const
 Function Kind() More...
 
bool OfKind (int aKindMask) const
 Function OfKind() More...
 
std::string KindStr () const
 Function KindStr() More...
 
void SetParent (BOARD_CONNECTED_ITEM *aParent)
 
BOARD_CONNECTED_ITEMParent () const
 
void SetNet (int aNet)
 
int Net () const
 
const LAYER_RANGELayers () const
 
void SetLayers (const LAYER_RANGE &aLayers)
 
void SetLayer (int aLayer)
 
virtual int Layer () const
 
bool LayersOverlap (const ITEM *aOther) const
 Function LayersOverlap() More...
 
NODEOwner () const
 Function Owner() More...
 
void SetOwner (NODE *aOwner)
 Functon SetOwner() More...
 
bool BelongsTo (NODE *aNode) const
 Function BelongsTo() More...
 
virtual bool Collide (const ITEM *aOther, int aClearance, bool aNeedMTV, VECTOR2I *aMTV, const NODE *aParentNode, bool aDifferentNetsOnly=true) const
 Function Collide() More...
 
virtual const SHAPEShape () const
 Function Shape() More...
 
virtual void Mark (int aMarker)
 
virtual void Unmark (int aMarker=-1)
 
virtual int Marker () const
 
virtual void SetRank (int aRank)
 
virtual int Rank () const
 
virtual VECTOR2I Anchor (int n) const
 
virtual int AnchorCount () const
 
bool IsLocked () const
 
void SetRoutable (bool aRoutable)
 
bool IsRoutable () const
 

Static Public Member Functions

static bool ClassOf (const ITEM *aItem)
 
static DIFF_PAIRAssembleDp (LINE *aLine)
 

Static Public Attributes

static const int UnusedNet = INT_MAX
 

Protected Attributes

PnsKind m_kind
 
BOARD_CONNECTED_ITEMm_parent
 
NODEm_owner
 
LAYER_RANGE m_layers
 
bool m_movable
 
int m_net
 
int m_marker
 
int m_rank
 
bool m_routable
 

Private Member Functions

void updateLine (LINE &aLine, const SHAPE_LINE_CHAIN &aShape, int aNet, VIA &aVia)
 

Private Attributes

SHAPE_LINE_CHAIN m_n
 
SHAPE_LINE_CHAIN m_p
 
LINE m_line_p
 
LINE m_line_n
 
VIA m_via_p
 
VIA m_via_n
 
bool m_hasVias
 
int m_net_p
 
int m_net_n
 
int m_width
 
int m_gap
 
int m_viaGap
 
int m_maxUncoupledLength
 
int m_chamferLimit
 
RANGED_NUM< int > m_gapConstraint
 

Detailed Description

Class DIFF_PAIR.

Basic class for a differential pair. Stores two PNS_LINEs (for positive and negative nets, respectively), the gap and coupling constraints.

Definition at line 265 of file pns_diff_pair.h.

Member Typedef Documentation

◆ COUPLED_SEGMENTS_VEC

Definition at line 287 of file pns_diff_pair.h.

Member Enumeration Documentation

◆ PnsKind

enum PNS::ITEM::PnsKind
inherited

Supported item types

Enumerator
SOLID_T 
LINE_T 
JOINT_T 
SEGMENT_T 
VIA_T 
DIFF_PAIR_T 
ANY_T 

Definition at line 59 of file pns_item.h.

60  {
61  SOLID_T = 1,
62  LINE_T = 2,
63  JOINT_T = 4,
64  SEGMENT_T = 8,
65  VIA_T = 16,
66  DIFF_PAIR_T = 32,
67  ANY_T = 0xff
68  };

Constructor & Destructor Documentation

◆ DIFF_PAIR() [1/4]

PNS::DIFF_PAIR::DIFF_PAIR ( )
inline

Definition at line 289 of file pns_diff_pair.h.

289  : ITEM( DIFF_PAIR_T ), m_hasVias( false )
290  {
291  // Initialize some members, to avoid uninitialized variables.
292  m_net_p = 0;
293  m_net_n = 0;;
294  m_width = 0;
295  m_gap = 0;
296  m_viaGap = 0;
298  m_chamferLimit = 0;
299  }
ITEM(PnsKind aKind)
Definition: pns_item.h:70

References m_chamferLimit, m_gap, m_maxUncoupledLength, m_net_n, m_net_p, m_viaGap, and m_width.

◆ DIFF_PAIR() [2/4]

PNS::DIFF_PAIR::DIFF_PAIR ( int  aGap)
inline

Definition at line 301 of file pns_diff_pair.h.

301  :
302  ITEM( DIFF_PAIR_T ),
303  m_hasVias( false )
304  {
305  m_gapConstraint = aGap;
306 
307  // Initialize other members, to avoid uninitialized variables.
308  m_net_p = 0;
309  m_net_n = 0;;
310  m_width = 0;
311  m_gap = 0;
312  m_viaGap = 0;
314  m_chamferLimit = 0;
315  }
RANGED_NUM< int > m_gapConstraint
ITEM(PnsKind aKind)
Definition: pns_item.h:70

References m_chamferLimit, m_gap, m_gapConstraint, m_maxUncoupledLength, m_net_n, m_net_p, m_viaGap, and m_width.

◆ DIFF_PAIR() [3/4]

PNS::DIFF_PAIR::DIFF_PAIR ( const SHAPE_LINE_CHAIN aP,
const SHAPE_LINE_CHAIN aN,
int  aGap = 0 
)
inline

Definition at line 317 of file pns_diff_pair.h.

317  :
318  ITEM( DIFF_PAIR_T ),
319  m_n( aN ),
320  m_p( aP ),
321  m_hasVias( false )
322  {
323  m_gapConstraint = aGap;
324 
325  // Initialize other members, to avoid uninitialized variables.
326  m_net_p = 0;
327  m_net_n = 0;;
328  m_width = 0;
329  m_gap = 0;
330  m_viaGap = 0;
332  m_chamferLimit = 0;
333  }
RANGED_NUM< int > m_gapConstraint
ITEM(PnsKind aKind)
Definition: pns_item.h:70
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n

References m_chamferLimit, m_gap, m_gapConstraint, m_maxUncoupledLength, m_net_n, m_net_p, m_viaGap, and m_width.

◆ DIFF_PAIR() [4/4]

PNS::DIFF_PAIR::DIFF_PAIR ( const LINE aLineP,
const LINE aLineN,
int  aGap = 0 
)
inline

Definition at line 335 of file pns_diff_pair.h.

335  :
336  ITEM( DIFF_PAIR_T ),
337  m_line_p( aLineP ),
338  m_line_n( aLineN ),
339  m_hasVias( false )
340  {
341  m_gapConstraint = aGap;
342  m_net_p = aLineP.Net();
343  m_net_n = aLineN.Net();
344  m_p = aLineP.CLine();
345  m_n = aLineN.CLine();
346 
347  // Do not leave unitialized members, and keep static analyser quiet:
348  m_width = 0;
349  m_gap = 0;
350  m_viaGap = 0;
352  m_chamferLimit = 0;
353  }
RANGED_NUM< int > m_gapConstraint
ITEM(PnsKind aKind)
Definition: pns_item.h:70
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n

References PNS::LINE::CLine(), m_chamferLimit, m_gap, m_gapConstraint, m_maxUncoupledLength, m_n, m_net_n, m_net_p, m_p, m_viaGap, m_width, and PNS::ITEM::Net().

Member Function Documentation

◆ Anchor()

virtual VECTOR2I PNS::ITEM::Anchor ( int  n) const
inlinevirtualinherited

Reimplemented in PNS::VIA, PNS::SEGMENT, and PNS::SOLID.

Definition at line 225 of file pns_item.h.

226  {
227  return VECTOR2I();
228  }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:587

Referenced by PNS::DP_PRIMITIVE_PAIR::CursorOrientation(), PNS::DP_PRIMITIVE_PAIR::DP_PRIMITIVE_PAIR(), and PNS::DIFF_PAIR_PLACER::getDanglingAnchor().

◆ AnchorCount()

virtual int PNS::ITEM::AnchorCount ( ) const
inlinevirtualinherited

Reimplemented in PNS::VIA, PNS::SEGMENT, and PNS::SOLID.

Definition at line 230 of file pns_item.h.

231  {
232  return 0;
233  }

◆ Append()

void PNS::DIFF_PAIR::Append ( const DIFF_PAIR aOther)
inline

Definition at line 466 of file pns_diff_pair.h.

467  {
468  m_n.Append( aOther.m_n );
469  m_p.Append( aOther.m_p );
470  }
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n

References SHAPE_LINE_CHAIN::Append(), m_n, and m_p.

◆ AppendVias()

void PNS::DIFF_PAIR::AppendVias ( const VIA aViaP,
const VIA aViaN 
)
inline

Definition at line 408 of file pns_diff_pair.h.

409  {
410  m_hasVias = true;
411  m_via_p = aViaP;
412  m_via_n = aViaN;
413  }

References m_hasVias, m_via_n, and m_via_p.

Referenced by PNS::DIFF_PAIR_PLACER::routeHead().

◆ AssembleDp()

static DIFF_PAIR* PNS::DIFF_PAIR::AssembleDp ( LINE aLine)
static

◆ BelongsTo()

bool PNS::ITEM::BelongsTo ( NODE aNode) const
inlineinherited

Function BelongsTo()

Returns
true if the item is owned by the node aNode.

Definition at line 186 of file pns_item.h.

187  {
188  return m_owner == aNode;
189  }
NODE * m_owner
Definition: pns_item.h:251

References PNS::ITEM::m_owner.

Referenced by PNS::NODE::doRemove().

◆ BuildInitial()

bool PNS::DIFF_PAIR::BuildInitial ( const DP_GATEWAY aEntry,
const DP_GATEWAY aTarget,
bool  aPrefDiagonal 
)

Definition at line 215 of file pns_diff_pair.cpp.

216 {
217  SHAPE_LINE_CHAIN p = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorP(), aTarget.AnchorP(), aPrefDiagonal );
218  SHAPE_LINE_CHAIN n = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorN(), aTarget.AnchorN(), aPrefDiagonal );
219 
220  int mask = aEntry.AllowedAngles() | DIRECTION_45::ANG_STRAIGHT | DIRECTION_45::ANG_OBTUSE;
221 
222  SHAPE_LINE_CHAIN sum_n, sum_p;
223  m_p = p;
224  m_n = n;
225 
226  if( aEntry.HasEntryLines() )
227  {
228  if( !aEntry.Entry().CheckConnectionAngle( *this, mask ) )
229  return false;
230 
231  sum_p = aEntry.Entry().CP();
232  sum_n = aEntry.Entry().CN();
233  sum_p.Append( p );
234  sum_n.Append( n );
235  }
236  else
237  {
238  sum_p = p;
239  sum_n = n;
240  }
241 
242  mask = aTarget.AllowedAngles() | DIRECTION_45::ANG_STRAIGHT | DIRECTION_45::ANG_OBTUSE;
243 
244  m_p = sum_p;
245  m_n = sum_n;
246 
247  if( aTarget.HasEntryLines() )
248  {
249  DP_GATEWAY t(aTarget) ;
250  t.Reverse();
251 
252  if( !CheckConnectionAngle( t.Entry(), mask ) )
253  return false;
254 
255  sum_p.Append( t.Entry().CP() );
256  sum_n.Append( t.Entry().CN() );
257  }
258 
259  m_p = sum_p;
260  m_n = sum_n;
261 
262  if( !checkGap ( p, n, m_gapConstraint ) )
263  return false;
264 
265  if( p.SelfIntersecting() || n.SelfIntersecting() )
266  return false;
267 
268  if( p.Intersects( n ) )
269  return false;
270 
271  return true;
272 }
static bool checkGap(const SHAPE_LINE_CHAIN &p, const SHAPE_LINE_CHAIN &n, int gap)
RANGED_NUM< int > m_gapConstraint
const SHAPE_LINE_CHAIN BuildInitialTrace(const VECTOR2I &aP0, const VECTOR2I &aP1, bool aStartDiagonal=false) const
Function BuildInitialTrace()
Definition: direction45.h:202
const OPT< INTERSECTION > SelfIntersecting() const
Function SelfIntersecting()
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
SHAPE_LINE_CHAIN m_p
Class DIRECTION_45.
Definition: direction45.h:36
bool Intersects(const SHAPE_LINE_CHAIN &aChain) const
SHAPE_LINE_CHAIN m_n
bool CheckConnectionAngle(const DIFF_PAIR &aOther, int allowedAngles) const
Class SHAPE_LINE_CHAIN.

References PNS::DP_GATEWAY::AllowedAngles(), PNS::DP_GATEWAY::AnchorN(), PNS::DP_GATEWAY::AnchorP(), DIRECTION_45::ANG_OBTUSE, DIRECTION_45::ANG_STRAIGHT, SHAPE_LINE_CHAIN::Append(), DIRECTION_45::BuildInitialTrace(), CheckConnectionAngle(), PNS::checkGap(), CN(), CP(), PNS::DP_GATEWAY::Entry(), PNS::DP_GATEWAY::HasEntryLines(), SHAPE_LINE_CHAIN::Intersects(), m_gapConstraint, m_n, m_p, PNS::DP_GATEWAY::Reverse(), and SHAPE_LINE_CHAIN::SelfIntersecting().

Referenced by PNS::DP_GATEWAYS::FitGateways().

◆ CheckConnectionAngle()

bool PNS::DIFF_PAIR::CheckConnectionAngle ( const DIFF_PAIR aOther,
int  allowedAngles 
) const

Definition at line 275 of file pns_diff_pair.cpp.

276 {
277  bool checkP, checkN;
278 
279  if( m_p.SegmentCount() == 0 || aOther.m_p.SegmentCount() == 0 )
280  checkP = true;
281  else
282  {
283  DIRECTION_45 p0( m_p.CSegment( -1 ) );
284  DIRECTION_45 p1( aOther.m_p.CSegment( 0 ) );
285 
286  checkP = ( p0.Angle( p1 ) & aAllowedAngles ) != 0;
287  }
288 
289  if( m_n.SegmentCount() == 0 || aOther.m_n.SegmentCount() == 0 )
290  checkN = true;
291  else
292  {
293  DIRECTION_45 n0( m_n.CSegment( -1 ) );
294  DIRECTION_45 n1( aOther.m_n.CSegment( 0 ) );
295 
296  checkN = ( n0.Angle( n1 ) & aAllowedAngles ) != 0;
297  }
298 
299  return checkP && checkN;
300 }
SHAPE_LINE_CHAIN m_p
Class DIRECTION_45.
Definition: direction45.h:36
int SegmentCount() const
Function SegmentCount()
SHAPE_LINE_CHAIN m_n
const SEG CSegment(int aIndex) const
Function CSegment()

References SHAPE_LINE_CHAIN::CSegment(), m_n, m_p, and SHAPE_LINE_CHAIN::SegmentCount().

Referenced by BuildInitial().

◆ ClassOf()

static bool PNS::DIFF_PAIR::ClassOf ( const ITEM aItem)
inlinestatic

Definition at line 355 of file pns_diff_pair.h.

356  {
357  return aItem && DIFF_PAIR_T == aItem->Kind();
358  }

References PNS::ITEM::DIFF_PAIR_T, and PNS::ITEM::Kind().

◆ Clear()

void PNS::DIFF_PAIR::Clear ( )
inline

Definition at line 460 of file pns_diff_pair.h.

461  {
462  m_n.Clear();
463  m_p.Clear();
464  }
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n
void Clear()
Function Clear() Removes all points from the line chain.

References SHAPE_LINE_CHAIN::Clear(), m_n, and m_p.

◆ Clone()

DIFF_PAIR* PNS::DIFF_PAIR::Clone ( ) const
inlineoverridevirtual

Function Clone()

Returns a deep copy of the item

Implements PNS::ITEM.

Definition at line 360 of file pns_diff_pair.h.

360 { assert( false ); return NULL; }

◆ CN()

◆ Collide()

bool PNS::ITEM::Collide ( const ITEM aOther,
int  aClearance,
bool  aNeedMTV,
VECTOR2I aMTV,
const NODE aParentNode,
bool  aDifferentNetsOnly = true 
) const
virtualinherited

Function Collide()

Checks for a collision (clearance violation) with between us and item aOther. Collision checking takes all PCB stuff into accound (layers, nets, DRC rules). Optionally returns a minimum translation vector for force propagation algorithm.

Parameters
aOtheritem to check collision against
aClearancedesired clearance
aNeedMTVwhen true, the minimum translation vector is calculated
aMTVthe minimum translation vector
Returns
true, if a collision was found.

Definition at line 48 of file pns_item.cpp.

50 {
51  if( collideSimple( aOther, aClearance, aNeedMTV, aMTV, aParentNode, aDifferentNetsOnly ) )
52  return true;
53 
54  // special case for "head" line with a via attached at the end.
55  if( aOther->m_kind == LINE_T )
56  {
57  const LINE* line = static_cast<const LINE*>( aOther );
58  int clearance = aClearance - line->Width() / 2;
59 
60  if( line->EndsWithVia() )
61  {
62  return collideSimple( &line->Via(), clearance, aNeedMTV, aMTV, aParentNode,
63  aDifferentNetsOnly );
64  }
65  }
66 
67  return false;
68 }
bool collideSimple(const ITEM *aOther, int aClearance, bool aNeedMTV, VECTOR2I *aMTV, const NODE *aParentNode, bool aDifferentNetsOnly) const
Definition: pns_item.cpp:30

References PNS::ITEM::collideSimple(), PNS::LINE::EndsWithVia(), PNS::ITEM::LINE_T, PNS::ITEM::m_kind, PNS::LINE::Via(), and PNS::LINE::Width().

Referenced by PNS::NODE::CheckColliding(), PNS::OPTIMIZER::CACHE_VISITOR::operator()(), and PNS::NODE::DEFAULT_OBSTACLE_VISITOR::operator()().

◆ CoupledLength() [1/3]

double PNS::DIFF_PAIR::CoupledLength ( ) const

Definition at line 876 of file pns_diff_pair.cpp.

877 {
878  COUPLED_SEGMENTS_VEC pairs;
879 
880  CoupledSegmentPairs( pairs );
881 
882  double l = 0.0;
883  for( unsigned int i = 0; i < pairs.size(); i++ )
884  l += pairs[i].coupledP.Length();
885 
886  return l;
887 }
void CoupledSegmentPairs(COUPLED_SEGMENTS_VEC &aPairs) const
std::vector< COUPLED_SEGMENTS > COUPLED_SEGMENTS_VEC
size_t i
Definition: json11.cpp:597

References CoupledSegmentPairs(), and i.

Referenced by CoupledLengthFactor(), PNS::OPTIMIZER::mergeDpStep(), and PNS::DIFF_PAIR_PLACER::tryWalkDp().

◆ CoupledLength() [2/3]

int PNS::DIFF_PAIR::CoupledLength ( const SEG aP,
const SEG aN 
) const

Definition at line 910 of file pns_diff_pair.cpp.

911 {
912  SEG p_clip, n_clip;
913  int64_t dist = std::abs( aP.Distance( aN ) - m_width );
914 
915  if( aP.ApproxParallel( aN ) && m_gapConstraint.Matches( dist ) &&
916  commonParallelProjection ( aP, aN, p_clip, n_clip ) )
917  return p_clip.Length();
918 
919  return 0;
920 }
int Length() const
Function Length()
Definition: seg.h:296
int Distance(const SEG &aSeg) const
Function Distance()
Definition: seg.h:199
static const int dist[10][10]
Definition: ar_matrix.cpp:320
RANGED_NUM< int > m_gapConstraint
#define abs(a)
Definition: auxiliary.h:84
bool ApproxParallel(const SEG &aSeg) const
Definition: seg.h:257
Definition: seg.h:36
bool commonParallelProjection(SEG p, SEG n, SEG &pClip, SEG &nClip)
bool Matches(const T &aOther) const
Definition: ranged_num.h:43

References abs, SEG::ApproxParallel(), PNS::commonParallelProjection(), dist, SEG::Distance(), SEG::Length(), m_gapConstraint, m_width, and RANGED_NUM< T >::Matches().

◆ CoupledLength() [3/3]

int64_t PNS::DIFF_PAIR::CoupledLength ( const SHAPE_LINE_CHAIN aP,
const SHAPE_LINE_CHAIN aN 
) const

Definition at line 851 of file pns_diff_pair.cpp.

852 {
853  int64_t total = 0;
854 
855  for( int i = 0; i < aP.SegmentCount(); i++ )
856  {
857  for( int j = 0; j < aN.SegmentCount(); j++ )
858  {
859  SEG sp = aP.CSegment( i );
860  SEG sn = aN.CSegment( j );
861 
862  SEG p_clip, n_clip;
863 
864  int64_t dist = std::abs( sp.Distance(sn) - m_width );
865 
866  if( sp.ApproxParallel( sn ) && m_gapConstraint.Matches( dist ) &&
867  commonParallelProjection( sp, sn, p_clip, n_clip ) )
868  total += p_clip.Length();
869  }
870  }
871 
872  return total;
873 }
int Length() const
Function Length()
Definition: seg.h:296
int Distance(const SEG &aSeg) const
Function Distance()
Definition: seg.h:199
static const int dist[10][10]
Definition: ar_matrix.cpp:320
RANGED_NUM< int > m_gapConstraint
#define abs(a)
Definition: auxiliary.h:84
bool ApproxParallel(const SEG &aSeg) const
Definition: seg.h:257
int SegmentCount() const
Function SegmentCount()
Definition: seg.h:36
const SEG CSegment(int aIndex) const
Function CSegment()
bool commonParallelProjection(SEG p, SEG n, SEG &pClip, SEG &nClip)
size_t i
Definition: json11.cpp:597
bool Matches(const T &aOther) const
Definition: ranged_num.h:43

References abs, SEG::ApproxParallel(), PNS::commonParallelProjection(), SHAPE_LINE_CHAIN::CSegment(), dist, SEG::Distance(), i, SEG::Length(), m_gapConstraint, m_width, RANGED_NUM< T >::Matches(), and SHAPE_LINE_CHAIN::SegmentCount().

◆ CoupledLengthFactor()

double PNS::DIFF_PAIR::CoupledLengthFactor ( ) const

Definition at line 890 of file pns_diff_pair.cpp.

891 {
892  double t = TotalLength();
893 
894  if( t == 0.0 )
895  return 0.0;
896 
897  return CoupledLength() / t;
898 }
double CoupledLength() const
double TotalLength() const

References CoupledLength(), and TotalLength().

◆ CoupledSegmentPairs()

void PNS::DIFF_PAIR::CoupledSegmentPairs ( COUPLED_SEGMENTS_VEC aPairs) const

Definition at line 822 of file pns_diff_pair.cpp.

823 {
824  SHAPE_LINE_CHAIN p( m_p );
825  SHAPE_LINE_CHAIN n( m_n );
826 
827  p.Simplify();
828  n.Simplify();
829 
830  for( int i = 0; i < p.SegmentCount(); i++ )
831  {
832  for( int j = 0; j < n.SegmentCount(); j++ )
833  {
834  SEG sp = p.CSegment( i );
835  SEG sn = n.CSegment( j );
836 
837  SEG p_clip, n_clip;
838 
839  int64_t dist = std::abs( sp.Distance( sn ) - m_width );
840 
841  if( sp.ApproxParallel( sn ) && m_gapConstraint.Matches( dist ) && commonParallelProjection( sp, sn, p_clip, n_clip ) )
842  {
843  const COUPLED_SEGMENTS spair( p_clip, sp, i, n_clip, sn, j );
844  aPairs.push_back( spair );
845  }
846  }
847  }
848 }
int Distance(const SEG &aSeg) const
Function Distance()
Definition: seg.h:199
static const int dist[10][10]
Definition: ar_matrix.cpp:320
RANGED_NUM< int > m_gapConstraint
#define abs(a)
Definition: auxiliary.h:84
bool ApproxParallel(const SEG &aSeg) const
Definition: seg.h:257
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n
Definition: seg.h:36
Class SHAPE_LINE_CHAIN.
bool commonParallelProjection(SEG p, SEG n, SEG &pClip, SEG &nClip)
size_t i
Definition: json11.cpp:597
bool Matches(const T &aOther) const
Definition: ranged_num.h:43

References abs, SEG::ApproxParallel(), PNS::commonParallelProjection(), SHAPE_LINE_CHAIN::CSegment(), dist, SEG::Distance(), i, m_gapConstraint, m_n, m_p, m_width, RANGED_NUM< T >::Matches(), SHAPE_LINE_CHAIN::SegmentCount(), and SHAPE_LINE_CHAIN::Simplify().

Referenced by CoupledLength().

◆ CP()

◆ Empty()

bool PNS::DIFF_PAIR::Empty ( ) const
inline

Definition at line 472 of file pns_diff_pair.h.

473  {
474  return ( m_n.SegmentCount() == 0 ) || ( m_p.SegmentCount() == 0 );
475  }
SHAPE_LINE_CHAIN m_p
int SegmentCount() const
Function SegmentCount()
SHAPE_LINE_CHAIN m_n

References m_n, m_p, and SHAPE_LINE_CHAIN::SegmentCount().

◆ EndingPrimitives()

DP_PRIMITIVE_PAIR PNS::DIFF_PAIR::EndingPrimitives ( )

Definition at line 754 of file pns_diff_pair.cpp.

755 {
756  if( m_hasVias )
757  return DP_PRIMITIVE_PAIR( &m_via_p, &m_via_n );
758  else
759  {
760  const LINE lP( PLine() );
761  const LINE lN( NLine() );
762 
763  SEGMENT sP( lP, lP.CSegment( -1 ) );
764  SEGMENT sN( lN, lN.CSegment( -1 ) );
765 
766  DP_PRIMITIVE_PAIR dpair( &sP, &sN );
767  dpair.SetAnchors( sP.Seg().B, sN.Seg().B );
768 
769  return dpair;
770  }
771 }

References PNS::LINE::CSegment(), m_hasVias, m_via_n, m_via_p, NLine(), and PLine().

Referenced by PNS::DIFF_PAIR_PLACER::FixRoute().

◆ EndsWithVias()

bool PNS::DIFF_PAIR::EndsWithVias ( ) const
inline

Definition at line 420 of file pns_diff_pair.h.

421  {
422  return m_hasVias;
423  }

References m_hasVias.

Referenced by PNS::DIFF_PAIR_PLACER::FixRoute().

◆ Gap()

int PNS::DIFF_PAIR::Gap ( ) const
inline

◆ GapConstraint()

const RANGED_NUM<int> PNS::DIFF_PAIR::GapConstraint ( ) const
inline

Definition at line 486 of file pns_diff_pair.h.

487  {
488  return m_gapConstraint;
489  }
RANGED_NUM< int > m_gapConstraint

References m_gapConstraint.

Referenced by PNS::findCoupledVertices().

◆ Hull()

virtual const SHAPE_LINE_CHAIN PNS::ITEM::Hull ( int  aClearance = 0,
int  aWalkaroundThickness = 0 
) const
inlinevirtualinherited

Reimplemented in PNS::VIA, PNS::SEGMENT, and PNS::SOLID.

Definition at line 112 of file pns_item.h.

113  {
114  return SHAPE_LINE_CHAIN();
115  }
Class SHAPE_LINE_CHAIN.

◆ IsLocked()

bool PNS::ITEM::IsLocked ( ) const
inlineinherited

Definition at line 235 of file pns_item.h.

236  {
237  return Marker() & MK_LOCKED;
238  }
virtual int Marker() const
Definition: pns_item.h:220

References PNS::ITEM::Marker(), and PNS::MK_LOCKED.

Referenced by ROUTER_TOOL::InlineBreakTrack(), ROUTER_TOOL::InlineDrag(), ROUTER_TOOL::performDragging(), and PNS::SHOVE::pushOrShoveVia().

◆ IsRoutable()

bool PNS::ITEM::IsRoutable ( ) const
inlineinherited

Definition at line 241 of file pns_item.h.

241 { return m_routable; }
bool m_routable
Definition: pns_item.h:258

References PNS::ITEM::m_routable.

◆ Kind()

◆ KindStr()

std::string PNS::ITEM::KindStr ( ) const
inherited

Function KindStr()

Returns the kind of the item, as string

Definition at line 71 of file pns_item.cpp.

72 {
73  switch( m_kind )
74  {
75  case LINE_T: return "line";
76  case SEGMENT_T: return "segment";
77  case VIA_T: return "via";
78  case JOINT_T: return "joint";
79  case SOLID_T: return "solid";
80  default: return "unknown";
81  }
82 }
PnsKind m_kind
Definition: pns_item.h:248

References PNS::ITEM::JOINT_T, PNS::ITEM::LINE_T, PNS::ITEM::m_kind, PNS::ITEM::SEGMENT_T, PNS::ITEM::SOLID_T, and PNS::ITEM::VIA_T.

Referenced by PNS::TOOL_BASE::pickSingleItem(), and PNS::TOOL_BASE::updateEndItem().

◆ Layer()

virtual int PNS::ITEM::Layer ( ) const
inlinevirtualinherited

Reimplemented in PNS::SEGMENT.

Definition at line 154 of file pns_item.h.

154 { return Layers().Start(); }
int Start() const
Definition: pns_layerset.h:83
const LAYER_RANGE & Layers() const
Definition: pns_item.h:150

References PNS::ITEM::Layers(), and LAYER_RANGE::Start().

Referenced by PNS::OPTIMIZER::fanoutCleanup(), and PNS::OPTIMIZER::runSmartPads().

◆ Layers()

◆ LayersOverlap()

bool PNS::ITEM::LayersOverlap ( const ITEM aOther) const
inlineinherited

Function LayersOverlap()

Returns true if the set of layers spanned by aOther overlaps our layers.

Definition at line 162 of file pns_item.h.

163  {
164  return Layers().Overlaps( aOther->Layers() );
165  }
bool Overlaps(const LAYER_RANGE &aOther) const
Definition: pns_layerset.h:68
const LAYER_RANGE & Layers() const
Definition: pns_item.h:150

References PNS::ITEM::Layers(), and LAYER_RANGE::Overlaps().

Referenced by PNS::SHOVE::onCollidingSegment(), PNS::SHOVE::ProcessSingleLine(), and PNS::NODE::removeViaIndex().

◆ Mark()

virtual void PNS::ITEM::Mark ( int  aMarker)
inlinevirtualinherited

Reimplemented in PNS::LINE.

Definition at line 218 of file pns_item.h.

218 { m_marker = aMarker; }
int m_marker
Definition: pns_item.h:256

References PNS::ITEM::m_marker.

◆ Marker()

virtual int PNS::ITEM::Marker ( ) const
inlinevirtualinherited

Reimplemented in PNS::LINE.

Definition at line 220 of file pns_item.h.

220 { return m_marker; }
int m_marker
Definition: pns_item.h:256

References PNS::ITEM::m_marker.

Referenced by PNS::ITEM::IsLocked(), PNS::LOGGER::Log(), PNS::SHOVE::pushOrShoveVia(), and ROUTER_PREVIEW_ITEM::Update().

◆ Net()

◆ NetN()

int PNS::DIFF_PAIR::NetN ( ) const
inline

Definition at line 430 of file pns_diff_pair.h.

431  {
432  return m_net_n;
433  }

References m_net_n.

Referenced by PNS::DP_MEANDER_PLACER::CurrentNets().

◆ NetP()

int PNS::DIFF_PAIR::NetP ( ) const
inline

Definition at line 425 of file pns_diff_pair.h.

426  {
427  return m_net_p;
428  }

References m_net_p.

Referenced by PNS::DP_MEANDER_PLACER::CurrentNets().

◆ NLine()

◆ OfKind()

◆ Owner()

NODE* PNS::ITEM::Owner ( ) const
inlineinherited

Function Owner()

Returns the owner of this item, or NULL if there's none.

Definition at line 172 of file pns_item.h.

172 { return m_owner; }
NODE * m_owner
Definition: pns_item.h:251

References PNS::ITEM::m_owner.

Referenced by PNS::SIZES_SETTINGS::inheritTrackWidth(), and PNS::LINE_PLACER::Move().

◆ Parent()

◆ PLine()

◆ Rank()

virtual int PNS::ITEM::Rank ( ) const
inlinevirtualinherited

Reimplemented in PNS::LINE.

Definition at line 223 of file pns_item.h.

223 { return m_rank; }
int m_rank
Definition: pns_item.h:257

References PNS::ITEM::m_rank.

Referenced by PNS::LINE::LINE(), PNS::LOGGER::Log(), PNS::SHOVE::onCollidingVia(), and PNS::SHOVE::shoveIteration().

◆ RemoveVias()

void PNS::DIFF_PAIR::RemoveVias ( )
inline

Definition at line 415 of file pns_diff_pair.h.

416  {
417  m_hasVias = false;
418  }

References m_hasVias.

◆ SetGap()

void PNS::DIFF_PAIR::SetGap ( int  aGap)
inline

◆ SetLayer()

void PNS::ITEM::SetLayer ( int  aLayer)
inlineinherited

Definition at line 153 of file pns_item.h.

153 { m_layers = LAYER_RANGE( aLayer, aLayer ); }
LAYER_RANGE m_layers
Definition: pns_item.h:252
Class LAYER_RANGE.
Definition: pns_layerset.h:32

References PNS::ITEM::m_layers.

Referenced by PNS::LINE_PLACER::initPlacement(), PNS::DIFF_PAIR_PLACER::propagateDpHeadForces(), PNS::DIFF_PAIR_PLACER::routeHead(), and updateLine().

◆ SetLayers()

void PNS::ITEM::SetLayers ( const LAYER_RANGE aLayers)
inlineinherited

Definition at line 151 of file pns_item.h.

151 { m_layers = aLayers; }
LAYER_RANGE m_layers
Definition: pns_item.h:252

References PNS::ITEM::m_layers.

Referenced by PNS::TOPOLOGY::AssembleDiffPair(), PNS::NODE::AssembleLine(), PNS::VIA::Clone(), PNS::SEGMENT::SetLayer(), and PNS::VIA::VIA().

◆ SetNet()

◆ SetNets()

void PNS::DIFF_PAIR::SetNets ( int  aP,
int  aN 
)
inline

Definition at line 384 of file pns_diff_pair.h.

385  {
386  m_net_p = aP;
387  m_net_n = aN;
388  }

References m_net_n, and m_net_p.

Referenced by PNS::DIFF_PAIR_PLACER::routeHead().

◆ SetOwner()

void PNS::ITEM::SetOwner ( NODE aOwner)
inlineinherited

Functon SetOwner()

Sets the node that owns this item. An item can belong to a single NODE or be unowned.

Definition at line 179 of file pns_item.h.

179 { m_owner = aOwner; }
NODE * m_owner
Definition: pns_item.h:251

References PNS::ITEM::m_owner.

Referenced by PNS::NODE::AssembleLine(), PNS::NODE::doRemove(), and PNS::NODE::Remove().

◆ SetParent()

void PNS::ITEM::SetParent ( BOARD_CONNECTED_ITEM aParent)
inlineinherited

Definition at line 144 of file pns_item.h.

144 { m_parent = aParent; }
BOARD_CONNECTED_ITEM * m_parent
Definition: pns_item.h:250

References PNS::ITEM::m_parent.

Referenced by PNS_KICAD_IFACE::AddItem().

◆ SetRank()

virtual void PNS::ITEM::SetRank ( int  aRank)
inlinevirtualinherited

Reimplemented in PNS::LINE.

Definition at line 222 of file pns_item.h.

222 { m_rank = aRank; }
int m_rank
Definition: pns_item.h:257

References PNS::ITEM::m_rank.

◆ SetRoutable()

void PNS::ITEM::SetRoutable ( bool  aRoutable)
inlineinherited

Definition at line 240 of file pns_item.h.

240 { m_routable = aRoutable; }
bool m_routable
Definition: pns_item.h:258

References PNS::ITEM::m_routable.

◆ SetShape() [1/2]

void PNS::DIFF_PAIR::SetShape ( const SHAPE_LINE_CHAIN aP,
const SHAPE_LINE_CHAIN aN,
bool  aSwapLanes = false 
)
inline

Definition at line 364 of file pns_diff_pair.h.

365  {
366  if( aSwapLanes )
367  {
368  m_p = aN;
369  m_n = aP;
370  }
371  else
372  {
373  m_p = aP;
374  m_n = aN;
375  }
376  }
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n

References m_n, and m_p.

Referenced by PNS::DIFF_PAIR_PLACER::attemptWalk(), PNS::DP_GATEWAYS::FitGateways(), PNS::DIFF_PAIR_PLACER::FixRoute(), PNS::OPTIMIZER::mergeDpStep(), and PNS::DIFF_PAIR_PLACER::tryWalkDp().

◆ SetShape() [2/2]

void PNS::DIFF_PAIR::SetShape ( const DIFF_PAIR aPair)
inline

Definition at line 378 of file pns_diff_pair.h.

379  {
380  m_p = aPair.m_p;
381  m_n = aPair.m_n;
382  }
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n

References m_n, and m_p.

◆ SetWidth()

void PNS::DIFF_PAIR::SetWidth ( int  aWidth)
inline

Definition at line 390 of file pns_diff_pair.h.

391  {
392  m_width = aWidth;
393  }

References m_width.

Referenced by PNS::TOPOLOGY::AssembleDiffPair(), and PNS::DIFF_PAIR_PLACER::routeHead().

◆ Shape()

virtual const SHAPE* PNS::ITEM::Shape ( ) const
inlinevirtualinherited

◆ Skew()

double PNS::DIFF_PAIR::Skew ( ) const

Definition at line 816 of file pns_diff_pair.cpp.

817 {
818  return m_p.Length() - m_n.Length();
819 }
long long int Length() const
Function Length()
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n

References SHAPE_LINE_CHAIN::Length(), m_n, and m_p.

Referenced by PNS::DIFF_PAIR_PLACER::tryWalkDp().

◆ TotalLength()

double PNS::DIFF_PAIR::TotalLength ( ) const

Definition at line 901 of file pns_diff_pair.cpp.

902 {
903  double lenP = m_p.Length();
904  double lenN = m_n.Length();
905 
906  return (lenN + lenP ) / 2.0;
907 }
long long int Length() const
Function Length()
SHAPE_LINE_CHAIN m_p
SHAPE_LINE_CHAIN m_n

References SHAPE_LINE_CHAIN::Length(), m_n, and m_p.

Referenced by CoupledLengthFactor().

◆ Unmark()

virtual void PNS::ITEM::Unmark ( int  aMarker = -1)
inlinevirtualinherited

Reimplemented in PNS::LINE.

Definition at line 219 of file pns_item.h.

219 { m_marker &= ~aMarker; }
int m_marker
Definition: pns_item.h:256

References PNS::ITEM::m_marker.

Referenced by PNS::DRAGGER::Start().

◆ updateLine()

void PNS::DIFF_PAIR::updateLine ( LINE aLine,
const SHAPE_LINE_CHAIN aShape,
int  aNet,
VIA aVia 
)
inlineprivate

Definition at line 492 of file pns_diff_pair.h.

493  {
494  aLine.SetShape( aShape );
495  aLine.SetWidth( m_width );
496  aLine.SetNet( aNet );
497  aLine.SetLayer( Layers().Start() );
498 
499  if( m_hasVias )
500  aLine.AppendVia( aVia );
501  }
const LAYER_RANGE & Layers() const
Definition: pns_item.h:150

References PNS::LINE::AppendVia(), PNS::ITEM::Layers(), m_hasVias, m_width, PNS::ITEM::SetLayer(), PNS::ITEM::SetNet(), PNS::LINE::SetShape(), and PNS::LINE::SetWidth().

Referenced by NLine(), and PLine().

◆ Width()

int PNS::DIFF_PAIR::Width ( ) const
inline

Definition at line 395 of file pns_diff_pair.h.

395 { return m_width; }

References m_width.

Referenced by PNS::findCoupledVertices(), and PNS::DP_MEANDER_PLACER::Start().

Member Data Documentation

◆ m_chamferLimit

int PNS::DIFF_PAIR::m_chamferLimit
private

Definition at line 513 of file pns_diff_pair.h.

Referenced by DIFF_PAIR().

◆ m_gap

int PNS::DIFF_PAIR::m_gap
private

Definition at line 510 of file pns_diff_pair.h.

Referenced by DIFF_PAIR(), Gap(), and SetGap().

◆ m_gapConstraint

RANGED_NUM<int> PNS::DIFF_PAIR::m_gapConstraint
private

◆ m_hasVias

bool PNS::DIFF_PAIR::m_hasVias
private

Definition at line 507 of file pns_diff_pair.h.

Referenced by AppendVias(), EndingPrimitives(), EndsWithVias(), RemoveVias(), and updateLine().

◆ m_kind

PnsKind PNS::ITEM::m_kind
protectedinherited

◆ m_layers

◆ m_line_n

LINE PNS::DIFF_PAIR::m_line_n
private

Definition at line 504 of file pns_diff_pair.h.

Referenced by NLine().

◆ m_line_p

LINE PNS::DIFF_PAIR::m_line_p
private

Definition at line 504 of file pns_diff_pair.h.

Referenced by PLine().

◆ m_marker

◆ m_maxUncoupledLength

int PNS::DIFF_PAIR::m_maxUncoupledLength
private

Definition at line 512 of file pns_diff_pair.h.

Referenced by DIFF_PAIR().

◆ m_movable

bool PNS::ITEM::m_movable
protectedinherited

◆ m_n

◆ m_net

◆ m_net_n

int PNS::DIFF_PAIR::m_net_n
private

Definition at line 508 of file pns_diff_pair.h.

Referenced by DIFF_PAIR(), NetN(), NLine(), and SetNets().

◆ m_net_p

int PNS::DIFF_PAIR::m_net_p
private

Definition at line 508 of file pns_diff_pair.h.

Referenced by DIFF_PAIR(), NetP(), PLine(), and SetNets().

◆ m_owner

NODE* PNS::ITEM::m_owner
protectedinherited

◆ m_p

◆ m_parent

BOARD_CONNECTED_ITEM* PNS::ITEM::m_parent
protectedinherited

◆ m_rank

◆ m_routable

bool PNS::ITEM::m_routable
protectedinherited

Definition at line 258 of file pns_item.h.

Referenced by PNS::ITEM::IsRoutable(), PNS::ITEM::ITEM(), and PNS::ITEM::SetRoutable().

◆ m_via_n

VIA PNS::DIFF_PAIR::m_via_n
private

Definition at line 505 of file pns_diff_pair.h.

Referenced by AppendVias(), EndingPrimitives(), and NLine().

◆ m_via_p

VIA PNS::DIFF_PAIR::m_via_p
private

Definition at line 505 of file pns_diff_pair.h.

Referenced by AppendVias(), EndingPrimitives(), and PLine().

◆ m_viaGap

int PNS::DIFF_PAIR::m_viaGap
private

Definition at line 511 of file pns_diff_pair.h.

Referenced by DIFF_PAIR().

◆ m_width

int PNS::DIFF_PAIR::m_width
private

◆ UnusedNet

const int PNS::ITEM::UnusedNet = INT_MAX
staticinherited

Definition at line 56 of file pns_item.h.

Referenced by PNS::ITEM::ITEM().


The documentation for this class was generated from the following files: