Implement time-domain length tuning

- Adds time and delay units
- Adds time domain tuning parameters entry and storage
- Adds pad-to-die delay property
- Adds time domain parameter interface for length / delay calculations
- Adds unit tracking for numerical constants through LIBEVAL
   - Will need future work to truly propagate through binary expressions
- Adds time domain tuning to meander placers
- Adds time delay display to net inspector panel
- Modifies DRC to handle time domain constraints
This commit is contained in:
JamesJCode
2025-04-17 21:46:56 +01:00
parent 0820e90c73
commit eb17ebee4e
113 changed files with 13444 additions and 1101 deletions
+120 -33
View File
@@ -117,6 +117,23 @@ bool EDA_UNIT_UTILS::FetchUnitsFromString( const wxString& aTextValue, EDA_UNITS
aUnits = EDA_UNITS::INCH;
else if( unit == wxT( "de" ) || unit == wxT( "ra" ) ) // "deg" or "rad"
aUnits = EDA_UNITS::DEGREES;
else if( unit == wxT("fs" ) )
aUnits = EDA_UNITS::FS;
else if( unit == wxT( "ps" ) )
{
wxString timeUnit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 5 ).Lower() );
if( timeUnit == wxT( "ps" ) )
aUnits = EDA_UNITS::PS;
else if( timeUnit == wxT( "ps/in" ) )
aUnits = EDA_UNITS::PS_PER_INCH;
else if( timeUnit == wxT( "ps/cm" ) )
aUnits = EDA_UNITS::PS_PER_CM;
else if( timeUnit == wxT( "ps/mm" ) )
aUnits = EDA_UNITS::PS_PER_MM;
else
return false;
}
else
return false;
@@ -130,15 +147,20 @@ wxString EDA_UNIT_UTILS::GetText( EDA_UNITS aUnits, EDA_DATA_TYPE aType )
switch( aUnits )
{
case EDA_UNITS::UM: label = wxT( " \u00B5m" ); break; //00B5 for µ
case EDA_UNITS::MM: label = wxT( " mm" ); break;
case EDA_UNITS::CM: label = wxT( " cm" ); break;
case EDA_UNITS::DEGREES: label = wxT( "°" ); break;
case EDA_UNITS::MILS: label = wxT( " mils" ); break;
case EDA_UNITS::INCH: label = wxT( " in" ); break;
case EDA_UNITS::PERCENT: label = wxT( "%" ); break;
case EDA_UNITS::UNSCALED: break;
default: UNIMPLEMENTED_FOR( wxS( "Unknown units" ) ); break;
case EDA_UNITS::UM: label = wxT( " \u00B5m" ); break; //00B5 for µ
case EDA_UNITS::MM: label = wxT( " mm" ); break;
case EDA_UNITS::CM: label = wxT( " cm" ); break;
case EDA_UNITS::DEGREES: label = wxT( "°" ); break;
case EDA_UNITS::MILS: label = wxT( " mils" ); break;
case EDA_UNITS::INCH: label = wxT( " in" ); break;
case EDA_UNITS::PERCENT: label = wxT( "%" ); break;
case EDA_UNITS::FS: label = wxT( " fs" ); break;
case EDA_UNITS::PS: label = wxT( " ps" ); break;
case EDA_UNITS::PS_PER_INCH: label = wxT( " ps/in" ); break;
case EDA_UNITS::PS_PER_CM: label = wxT( " ps/cm"); break;
case EDA_UNITS::PS_PER_MM: label = wxT( " ps/mm"); break;
case EDA_UNITS::UNSCALED: break;
default: UNIMPLEMENTED_FOR( wxS( "Unknown units" ) ); break;
}
switch( aType )
@@ -146,6 +168,8 @@ wxString EDA_UNIT_UTILS::GetText( EDA_UNITS aUnits, EDA_DATA_TYPE aType )
case EDA_DATA_TYPE::VOLUME: label += wxT( "³" ); break;
case EDA_DATA_TYPE::AREA: label += wxT( "²" ); break;
case EDA_DATA_TYPE::DISTANCE: break;
case EDA_DATA_TYPE::TIME: break;
case EDA_DATA_TYPE::LENGTH_DELAY: break;
default: UNIMPLEMENTED_FOR( wxS( "Unknown measurement" ) ); break;
}
@@ -253,9 +277,13 @@ bool EDA_UNIT_UTILS::ParseInternalUnits( const std::string& aInput, const EDA_IU
#define IU_TO_MM( x, scale ) ( x / scale.IU_PER_MM )
#define IU_TO_IN( x, scale ) ( x / scale.IU_PER_MILS / 1000 )
#define IU_TO_MILS( x, scale ) ( x / scale.IU_PER_MILS )
#define IU_TO_PS( x, scale ) ( x / scale.IU_PER_PS )
#define IU_TO_PS_PER_MM( x, scale ) ( x / scale.IU_PER_PS_PER_MM )
#define MM_TO_IU( x, scale ) ( x * scale.IU_PER_MM )
#define IN_TO_IU( x, scale ) ( x * scale.IU_PER_MILS * 1000 )
#define MILS_TO_IU( x, scale ) ( x * scale.IU_PER_MILS )
#define PS_TO_IU( x, scale ) ( x * scale.IU_PER_PS )
#define PS_PER_MM_TO_IU( x, scale ) ( x * scale.IU_PER_PS_PER_MM )
double EDA_UNIT_UTILS::UI::ToUserUnit( const EDA_IU_SCALE& aIuScale, EDA_UNITS aUnit,
@@ -263,13 +291,18 @@ double EDA_UNIT_UTILS::UI::ToUserUnit( const EDA_IU_SCALE& aIuScale, EDA_UNITS a
{
switch( aUnit )
{
case EDA_UNITS::UM: return IU_TO_MM( aValue, aIuScale ) * 1000;
case EDA_UNITS::MM: return IU_TO_MM( aValue, aIuScale );
case EDA_UNITS::CM: return IU_TO_MM( aValue, aIuScale ) / 10;
case EDA_UNITS::MILS: return IU_TO_MILS( aValue, aIuScale );
case EDA_UNITS::INCH: return IU_TO_IN( aValue, aIuScale );
case EDA_UNITS::DEGREES: return aValue;
default: return aValue;
case EDA_UNITS::UM: return IU_TO_MM( aValue, aIuScale ) * 1000;
case EDA_UNITS::MM: return IU_TO_MM( aValue, aIuScale );
case EDA_UNITS::CM: return IU_TO_MM( aValue, aIuScale ) / 10;
case EDA_UNITS::MILS: return IU_TO_MILS( aValue, aIuScale );
case EDA_UNITS::INCH: return IU_TO_IN( aValue, aIuScale );
case EDA_UNITS::DEGREES: return aValue;
case EDA_UNITS::FS: return IU_TO_PS( aValue, aIuScale ) * 1000.0;
case EDA_UNITS::PS: return IU_TO_PS( aValue, aIuScale );
case EDA_UNITS::PS_PER_INCH: return IU_TO_PS_PER_MM( aValue, aIuScale ) * 25.4;
case EDA_UNITS::PS_PER_CM: return IU_TO_PS_PER_MM( aValue, aIuScale ) * 10;
case EDA_UNITS::PS_PER_MM: return IU_TO_PS_PER_MM( aValue, aIuScale );
default: return aValue;
}
}
@@ -297,6 +330,14 @@ wxString EDA_UNIT_UTILS::UI::StringFromValue( const EDA_IU_SCALE& aIuScale, EDA_
case EDA_DATA_TYPE::UNITLESS:
break;
case EDA_DATA_TYPE::TIME:
value_to_print = ToUserUnit( aIuScale, aUnits, value_to_print );
break;
case EDA_DATA_TYPE::LENGTH_DELAY:
value_to_print = ToUserUnit( aIuScale, aUnits, value_to_print );
break;
}
const wxChar* format = nullptr;
@@ -304,10 +345,13 @@ wxString EDA_UNIT_UTILS::UI::StringFromValue( const EDA_IU_SCALE& aIuScale, EDA_
switch( aUnits )
{
case EDA_UNITS::MILS: format = is_eeschema ? wxT( "%.3f" ) : wxT( "%.5f" ); break;
case EDA_UNITS::INCH: format = is_eeschema ? wxT( "%.6f" ) : wxT( "%.8f" ); break;
case EDA_UNITS::DEGREES: format = wxT( "%.4f" ); break;
default: format = wxT( "%.10f" ); break;
case EDA_UNITS::MILS: format = is_eeschema ? wxT( "%.3f" ) : wxT( "%.5f" ); break;
case EDA_UNITS::INCH: format = is_eeschema ? wxT( "%.6f" ) : wxT( "%.8f" ); break;
case EDA_UNITS::DEGREES: format = wxT( "%.4f" ); break;
case EDA_UNITS::PS_PER_INCH: format = wxT( "%.4f" ); break;
case EDA_UNITS::PS_PER_CM: format = wxT( "%.3f" ); break;
case EDA_UNITS::PS_PER_MM: format = wxT( "%.3f" ); break;
default: format = wxT( "%.10f" ); break;
}
wxString text;
@@ -385,18 +429,31 @@ wxString EDA_UNIT_UTILS::UI::MessageTextFromValue( const EDA_IU_SCALE& aIuScale,
case EDA_DATA_TYPE::UNITLESS:
break;
case EDA_DATA_TYPE::TIME:
value = ToUserUnit( aIuScale, aUnits, value );
break;
case EDA_DATA_TYPE::LENGTH_DELAY:
value = ToUserUnit( aIuScale, aUnits, value );
break;
}
switch( aUnits )
{
default:
case EDA_UNITS::UM: format = is_eeschema ? wxT( "%.0f" ) : wxT( "%.1f" ); break;
case EDA_UNITS::MM: format = is_eeschema ? wxT( "%.2f" ) : wxT( "%.4f" ); break;
case EDA_UNITS::CM: format = is_eeschema ? wxT( "%.3f" ) : wxT( "%.5f" ); break;
case EDA_UNITS::MILS: format = is_eeschema ? wxT( "%.0f" ) : wxT( "%.2f" ); break;
case EDA_UNITS::INCH: format = is_eeschema ? wxT( "%.3f" ) : wxT( "%.4f" ); break;
case EDA_UNITS::DEGREES: format = wxT( "%.3f" ); break;
case EDA_UNITS::UNSCALED: format = wxT( "%.0f" ); break;
case EDA_UNITS::UM: format = is_eeschema ? wxT( "%.0f" ) : wxT( "%.1f" ); break;
case EDA_UNITS::MM: format = is_eeschema ? wxT( "%.2f" ) : wxT( "%.4f" ); break;
case EDA_UNITS::CM: format = is_eeschema ? wxT( "%.3f" ) : wxT( "%.5f" ); break;
case EDA_UNITS::MILS: format = is_eeschema ? wxT( "%.0f" ) : wxT( "%.2f" ); break;
case EDA_UNITS::INCH: format = is_eeschema ? wxT( "%.3f" ) : wxT( "%.4f" ); break;
case EDA_UNITS::DEGREES: format = wxT( "%.3f" ); break;
case EDA_UNITS::UNSCALED: format = wxT( "%.0f" ); break;
case EDA_UNITS::FS: format = wxT( "%.4f" ); break;
case EDA_UNITS::PS: format = wxT( "%.2f" ); break;
case EDA_UNITS::PS_PER_INCH: format = wxT( "%.2f" ); break;
case EDA_UNITS::PS_PER_CM: format = wxT( "%.2f" ); break;
case EDA_UNITS::PS_PER_MM: format = wxT( "%.2f" ); break;
}
text.Printf( format, value );
@@ -444,15 +501,20 @@ double EDA_UNIT_UTILS::UI::FromUserUnit( const EDA_IU_SCALE& aIuScale, EDA_UNITS
{
switch( aUnits )
{
case EDA_UNITS::UM: return MM_TO_IU( aValue / 1000.0, aIuScale );
case EDA_UNITS::MM: return MM_TO_IU( aValue, aIuScale );
case EDA_UNITS::CM: return MM_TO_IU( aValue * 10, aIuScale );
case EDA_UNITS::MILS: return MILS_TO_IU( aValue, aIuScale );
case EDA_UNITS::INCH: return IN_TO_IU( aValue, aIuScale );
case EDA_UNITS::UM: return MM_TO_IU( aValue / 1000.0, aIuScale );
case EDA_UNITS::MM: return MM_TO_IU( aValue, aIuScale );
case EDA_UNITS::CM: return MM_TO_IU( aValue * 10, aIuScale );
case EDA_UNITS::MILS: return MILS_TO_IU( aValue, aIuScale );
case EDA_UNITS::INCH: return IN_TO_IU( aValue, aIuScale );
case EDA_UNITS::FS: return PS_TO_IU( aValue / 1000.0, aIuScale );
case EDA_UNITS::PS: return PS_TO_IU( aValue, aIuScale );
case EDA_UNITS::PS_PER_INCH: return PS_PER_MM_TO_IU( aValue / 25.4, aIuScale );
case EDA_UNITS::PS_PER_CM: return PS_PER_MM_TO_IU( aValue / 10, aIuScale );
case EDA_UNITS::PS_PER_MM: return PS_PER_MM_TO_IU( aValue, aIuScale );
default:
case EDA_UNITS::DEGREES:
case EDA_UNITS::UNSCALED:
case EDA_UNITS::PERCENT: return aValue;
case EDA_UNITS::PERCENT: return aValue;
}
}
@@ -566,6 +628,23 @@ double EDA_UNIT_UTILS::UI::DoubleValueFromString( const EDA_IU_SCALE& aIuScale,
if( unit == wxT( "ra" ) ) // Radians
dtmp *= 180.0f / M_PI;
}
else if( aUnits == EDA_UNITS::FS || aUnits == EDA_UNITS::PS || aUnits == EDA_UNITS::PS_PER_INCH
|| aUnits == EDA_UNITS::PS_PER_CM || aUnits == EDA_UNITS::PS_PER_MM )
{
wxString timeUnit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 5 ).Lower() );
if( timeUnit == wxT( "fs" ) )
aUnits = EDA_UNITS::FS;
if( timeUnit == wxT( "ps" ) )
aUnits = EDA_UNITS::PS;
else if( timeUnit == wxT( "ps/in" ) )
aUnits = EDA_UNITS::PS_PER_INCH;
else if( timeUnit == wxT( "ps/cm" ) )
aUnits = EDA_UNITS::PS_PER_CM;
else if( timeUnit == wxT( "ps/mm" ) )
aUnits = EDA_UNITS::PS_PER_MM;
}
switch( aType )
{
@@ -583,6 +662,14 @@ double EDA_UNIT_UTILS::UI::DoubleValueFromString( const EDA_IU_SCALE& aIuScale,
case EDA_DATA_TYPE::UNITLESS:
break;
case EDA_DATA_TYPE::TIME:
dtmp = FromUserUnit( aIuScale, aUnits, dtmp );
break;
case EDA_DATA_TYPE::LENGTH_DELAY:
dtmp = FromUserUnit( aIuScale, aUnits, dtmp );
break;
}
return dtmp;