Ejemplo n.º 1
0
int PNS_PCBNEW_RULE_RESOLVER::Clearance( const PNS::ITEM* aA, const PNS::ITEM* aB ) const
{
    int net_a = aA->Net();
    int cl_a = ( net_a >= 0 ? m_netClearanceCache[net_a].clearance : m_defaultClearance );
    int net_b = aB->Net();
    int cl_b = ( net_b >= 0 ? m_netClearanceCache[net_b].clearance : m_defaultClearance );

    bool linesOnly = aA->OfKind( PNS::ITEM::SEGMENT_T | PNS::ITEM::LINE_T )
                  && aB->OfKind( PNS::ITEM::SEGMENT_T | PNS::ITEM::LINE_T );

    if( linesOnly && net_a >= 0 && net_b >= 0 && m_netClearanceCache[net_a].coupledNet == net_b )
    {
        cl_a = cl_b = m_router->Sizes().DiffPairGap() - 2 * PNS_HULL_MARGIN;
    }

    int pad_a = localPadClearance( aA );
    int pad_b = localPadClearance( aB );

    if( pad_a > 0 )
        cl_a = pad_a;

    if( pad_b > 0 )
        cl_b = pad_b;

    return std::max( cl_a, cl_b );
}
Ejemplo n.º 2
0
int PNS_PCBNEW_CLEARANCE_RESOLVER::query( const PNS_ITEM* aA, const PNS_ITEM* aB ) const
{
    int net_a = aA->Net();
    int cl_a = query( net_a );
    int net_b = aB->Net();
    int cl_b = query( net_b );

    bool linesOnly = aA->OfKind( PNS_ITEM::SEGMENT | PNS_ITEM::LINE ) && aB->OfKind( PNS_ITEM::SEGMENT | PNS_ITEM::LINE );

    if( net_a == net_b )
        return 0;

    if( m_useDpGap && linesOnly && net_a >= 0 && net_b >= 0 && m_clearanceCache[net_a].coupledNet == net_b )
    {
        cl_a = cl_b = m_router->Sizes().DiffPairGap() - 2 * PNS_HULL_MARGIN;
    }

    int pad_a = localPadClearance( aA );
    int pad_b = localPadClearance( aB );

    cl_a = std::max( cl_a, pad_a );
    cl_b = std::max( cl_b, pad_b );

    return std::max( cl_a, cl_b );
}
Ejemplo n.º 3
0
int PNS_PCBNEW_CLEARANCE_FUNC::operator()( const PNS_ITEM* aA, const PNS_ITEM* aB )
{
    int net_a = aA->Net();
    int cl_a = ( net_a >= 0 ? m_clearanceCache[net_a].clearance : m_defaultClearance );
    int net_b = aB->Net();
    int cl_b = ( net_b >= 0 ? m_clearanceCache[net_b].clearance : m_defaultClearance );

    bool linesOnly = aA->OfKind( PNS_ITEM::SEGMENT | PNS_ITEM::LINE ) && aB->OfKind( PNS_ITEM::SEGMENT | PNS_ITEM::LINE );

    if( linesOnly && net_a >= 0 && net_b >= 0 && m_clearanceCache[net_a].coupledNet == net_b )
    {
        cl_a = cl_b = m_router->Sizes().DiffPairGap() - 2 * PNS_HULL_MARGIN;
    }

    int pad_a = localPadClearance( aA );
    int pad_b = localPadClearance( aB );

    cl_a = std::max( cl_a, pad_a );
    cl_b = std::max( cl_b, pad_b );

    return std::max( cl_a, cl_b );
}