From c753d6cd34992200e203edef8aa05fdde6a40dfc Mon Sep 17 00:00:00 2001 From: Damjan Prerad Date: Sat, 28 Feb 2026 23:22:15 +0100 Subject: [PATCH] DRC Rule Editor: Add skew field to matched length diff pair constr. The matched length diff pair panel had skew data in the constraint class but no UI field to display or edit it. Added a dedicated overlay panel with min/opt/max length plus max skew fields, a new bitmap showing a diff pair with length arrows and skew indicator. --- common/bitmap_info.cpp | 6 + include/bitmaps/bitmaps_list.h | 1 + pcbnew/CMakeLists.txt | 1 + .../drc_re_abs_length_two_constraint_data.h | 23 +- ...matched_length_diff_pair_overlay_panel.cpp | 172 +++++++++++++ ...e_matched_length_diff_pair_overlay_panel.h | 65 +++++ .../drc/rule_editor/panel_drc_rule_editor.cpp | 6 + resources/bitmaps_png/CMakeLists.txt | 1 + .../generate_themed_constraints.py | 1 + ...constraint_matched_length_diff_pair_v2.png | Bin 0 -> 16298 bytes ...raint_matched_length_diff_pair_v2_dark.png | Bin 0 -> 16298 bytes .../matched-length-diff-pair-v2.svg | 228 ++++++++++++++++++ .../matched-length-diff-pair-v2.svg | 228 ++++++++++++++++++ .../matched-length-diff-pair-v2.svg | 228 ++++++++++++++++++ 14 files changed, 956 insertions(+), 4 deletions(-) create mode 100644 pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.cpp create mode 100644 pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.h create mode 100644 resources/bitmaps_png/png/constraint_matched_length_diff_pair_v2.png create mode 100644 resources/bitmaps_png/png/constraint_matched_length_diff_pair_v2_dark.png create mode 100644 resources/bitmaps_png/sources/constraints/matched-length-diff-pair-v2.svg create mode 100644 resources/bitmaps_png/sources/dark/constraints/matched-length-diff-pair-v2.svg create mode 100644 resources/bitmaps_png/sources/light/constraints/matched-length-diff-pair-v2.svg diff --git a/common/bitmap_info.cpp b/common/bitmap_info.cpp index 7d33458ccb..bc50e6d73d 100644 --- a/common/bitmap_info.cpp +++ b/common/bitmap_info.cpp @@ -5036,6 +5036,9 @@ void BuildBitmapInfo( std::unordered_map>& aBi aBitmapInfoCache[BITMAPS::constraint_hole_to_hole_distance].emplace_back( BITMAPS::constraint_hole_to_hole_distance, wxT( "constraint_hole_to_hole_distance.png" ), -1, wxT( "light" ) ); aBitmapInfoCache[BITMAPS::constraint_length].emplace_back( BITMAPS::constraint_length, wxT( "constraint_length.png" ), -1, wxT( "light" ) ); aBitmapInfoCache[BITMAPS::constraint_matched_length_diff_pair].emplace_back( BITMAPS::constraint_matched_length_diff_pair, wxT( "constraint_matched_length_diff_pair.png" ), -1, wxT( "light" ) ); + aBitmapInfoCache[BITMAPS::constraint_matched_length_diff_pair_v2].emplace_back( + BITMAPS::constraint_matched_length_diff_pair_v2, wxT( "constraint_matched_length_diff_pair_v2.png" ), -1, + wxT( "light" ) ); aBitmapInfoCache[BITMAPS::constraint_maximum_allowed_deviation].emplace_back( BITMAPS::constraint_maximum_allowed_deviation, wxT( "constraint_maximum_allowed_deviation.png" ), -1, wxT( "light" ) ); aBitmapInfoCache[BITMAPS::constraint_maximum_via_count].emplace_back( BITMAPS::constraint_maximum_via_count, wxT( "constraint_maximum_via_count.png" ), -1, wxT( "light" ) ); aBitmapInfoCache[BITMAPS::constraint_minimum_angular_ring].emplace_back( BITMAPS::constraint_minimum_angular_ring, wxT( "constraint_minimum_angular_ring.png" ), -1, wxT( "light" ) ); @@ -5071,6 +5074,9 @@ void BuildBitmapInfo( std::unordered_map>& aBi aBitmapInfoCache[BITMAPS::constraint_hole_to_hole_distance].emplace_back( BITMAPS::constraint_hole_to_hole_distance, wxT( "constraint_hole_to_hole_distance_dark.png" ), -1, wxT( "dark" ) ); aBitmapInfoCache[BITMAPS::constraint_length].emplace_back( BITMAPS::constraint_length, wxT( "constraint_length_dark.png" ), -1, wxT( "dark" ) ); aBitmapInfoCache[BITMAPS::constraint_matched_length_diff_pair].emplace_back( BITMAPS::constraint_matched_length_diff_pair, wxT( "constraint_matched_length_diff_pair_dark.png" ), -1, wxT( "dark" ) ); + aBitmapInfoCache[BITMAPS::constraint_matched_length_diff_pair_v2].emplace_back( + BITMAPS::constraint_matched_length_diff_pair_v2, wxT( "constraint_matched_length_diff_pair_v2_dark.png" ), + -1, wxT( "dark" ) ); aBitmapInfoCache[BITMAPS::constraint_maximum_allowed_deviation].emplace_back( BITMAPS::constraint_maximum_allowed_deviation, wxT( "constraint_maximum_allowed_deviation_dark.png" ), -1, wxT( "dark" ) ); aBitmapInfoCache[BITMAPS::constraint_maximum_via_count].emplace_back( BITMAPS::constraint_maximum_via_count, wxT( "constraint_maximum_via_count_dark.png" ), -1, wxT( "dark" ) ); aBitmapInfoCache[BITMAPS::constraint_minimum_angular_ring].emplace_back( BITMAPS::constraint_minimum_angular_ring, wxT( "constraint_minimum_angular_ring_dark.png" ), -1, wxT( "dark" ) ); diff --git a/include/bitmaps/bitmaps_list.h b/include/bitmaps/bitmaps_list.h index 728b220bec..e27ba43522 100644 --- a/include/bitmaps/bitmaps_list.h +++ b/include/bitmaps/bitmaps_list.h @@ -717,6 +717,7 @@ enum class BITMAPS : unsigned int constraint_maximum_allowed_deviation, constraint_minimum_angular_ring, constraint_matched_length_diff_pair, + constraint_matched_length_diff_pair_v2, constraint_routing_diff_pair, constraint_routing_width, constraint_clearance, diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 8947107248..7d25a59f67 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -333,6 +333,7 @@ set( PCBNEW_DRC_SRCS drc/rule_editor/drc_re_rtg_diff_pair_overlay_panel.cpp drc/rule_editor/drc_re_min_txt_ht_th_overlay_panel.cpp drc/rule_editor/drc_re_abs_length_two_overlay_panel.cpp + drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.cpp drc/rule_editor/drc_re_via_style_overlay_panel.cpp drc/rule_editor/drc_re_numeric_input_overlay_panel.cpp drc/rule_editor/drc_re_bool_input_overlay_panel.cpp diff --git a/pcbnew/drc/rule_editor/drc_re_abs_length_two_constraint_data.h b/pcbnew/drc/rule_editor/drc_re_abs_length_two_constraint_data.h index 0655e4e4ee..a553e0640d 100644 --- a/pcbnew/drc/rule_editor/drc_re_abs_length_two_constraint_data.h +++ b/pcbnew/drc/rule_editor/drc_re_abs_length_two_constraint_data.h @@ -157,14 +157,19 @@ class DRC_RE_MATCHED_LENGTH_DIFF_PAIR_CONSTRAINT_DATA : public DRC_RE_ABSOLUTE_L public: using DRC_RE_ABSOLUTE_LENGTH_TWO_CONSTRAINT_DATA::DRC_RE_ABSOLUTE_LENGTH_TWO_CONSTRAINT_DATA; - BITMAPS GetOverlayBitmap() const override { return BITMAPS::constraint_matched_length_diff_pair; } + BITMAPS GetOverlayBitmap() const override { return BITMAPS::constraint_matched_length_diff_pair_v2; } std::vector GetFieldPositions() const override { return { - { 335 + DRC_RE_OVERLAY_XO, 365 + DRC_RE_OVERLAY_XO, 33 + DRC_RE_OVERLAY_YO, 1, wxS( "mm" ), LABEL_POSITION::RIGHT }, // min_length - { 335 + DRC_RE_OVERLAY_XO, 365 + DRC_RE_OVERLAY_XO, 103 + DRC_RE_OVERLAY_YO, 2, wxS( "mm" ), LABEL_POSITION::RIGHT }, // opt_length - { 335 + DRC_RE_OVERLAY_XO, 365 + DRC_RE_OVERLAY_XO, 173 + DRC_RE_OVERLAY_YO, 3, wxS( "mm" ), LABEL_POSITION::RIGHT }, // max_length + { 527 + DRC_RE_OVERLAY_XO, 567 + DRC_RE_OVERLAY_XO, 133 + DRC_RE_OVERLAY_YO, 1, wxS( "mm" ), + LABEL_POSITION::RIGHT }, // min_length + { 670 + DRC_RE_OVERLAY_XO, 710 + DRC_RE_OVERLAY_XO, 162 + DRC_RE_OVERLAY_YO, 2, wxS( "mm" ), + LABEL_POSITION::RIGHT }, // opt_length + { 817 + DRC_RE_OVERLAY_XO, 857 + DRC_RE_OVERLAY_XO, 190 + DRC_RE_OVERLAY_YO, 3, wxS( "mm" ), + LABEL_POSITION::RIGHT }, // max_length + { 777 + DRC_RE_OVERLAY_XO, 815 + DRC_RE_OVERLAY_XO, -3 + DRC_RE_OVERLAY_YO, 4, wxS( "mm" ), + LABEL_POSITION::RIGHT }, // max_skew }; } @@ -196,6 +201,16 @@ public: m_maxSkew = source.m_maxSkew; } + VALIDATION_RESULT Validate() const override + { + VALIDATION_RESULT result = DRC_RE_ABSOLUTE_LENGTH_TWO_CONSTRAINT_DATA::Validate(); + + if( m_maxSkew < 0 ) + result.AddError( _( "Maximum Skew must be greater than or equal to 0" ) ); + + return result; + } + private: double m_maxSkew{ 0 }; }; diff --git a/pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.cpp b/pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.cpp new file mode 100644 index 0000000000..db73390c22 --- /dev/null +++ b/pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.cpp @@ -0,0 +1,172 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "drc_re_matched_length_diff_pair_overlay_panel.h" +#include "drc_re_abs_length_two_constraint_data.h" +#include "drc_rule_editor_utils.h" +#include "drc_re_validator_numeric_ctrl.h" + +#include +#include +#include + +#include +#include + +DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL::DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL( + wxWindow* aParent, DRC_RE_MATCHED_LENGTH_DIFF_PAIR_CONSTRAINT_DATA* aData, EDA_UNITS aUnits ) : + DRC_RE_BITMAP_OVERLAY_PANEL( aParent ), + m_data( aData ), + m_unitsProvider( pcbIUScale, aUnits ) +{ + SetBackgroundBitmap( aData->GetOverlayBitmap() ); + + std::vector positions = m_data->GetFieldPositions(); + + wxWindow* eventSource = nullptr; + + for( wxWindow* win = aParent; win; win = win->GetParent() ) + { + if( dynamic_cast( win ) ) + { + eventSource = win; + break; + } + } + + // Create min length field + auto* minLengthField = AddField( wxS( "min_length" ), positions[0], wxTE_CENTRE | wxTE_PROCESS_ENTER ); + m_minLengthBinder = + std::make_unique( &m_unitsProvider, eventSource, nullptr, minLengthField->GetControl(), + minLengthField->GetLabel(), false, false ); + minLengthField->SetUnitBinder( m_minLengthBinder.get() ); + minLengthField->GetControl()->SetValidator( VALIDATOR_NUMERIC_CTRL( false, false ) ); + + // Create opt length field + auto* optLengthField = AddField( wxS( "opt_length" ), positions[1], wxTE_CENTRE | wxTE_PROCESS_ENTER ); + m_optLengthBinder = + std::make_unique( &m_unitsProvider, eventSource, nullptr, optLengthField->GetControl(), + optLengthField->GetLabel(), false, false ); + optLengthField->SetUnitBinder( m_optLengthBinder.get() ); + optLengthField->GetControl()->SetValidator( VALIDATOR_NUMERIC_CTRL( false, false ) ); + + // Create max length field + auto* maxLengthField = AddField( wxS( "max_length" ), positions[2], wxTE_CENTRE | wxTE_PROCESS_ENTER ); + m_maxLengthBinder = + std::make_unique( &m_unitsProvider, eventSource, nullptr, maxLengthField->GetControl(), + maxLengthField->GetLabel(), false, false ); + maxLengthField->SetUnitBinder( m_maxLengthBinder.get() ); + maxLengthField->GetControl()->SetValidator( VALIDATOR_NUMERIC_CTRL( false, false ) ); + + // Create max skew field + auto* maxSkewField = AddField( wxS( "max_skew" ), positions[3], wxTE_CENTRE | wxTE_PROCESS_ENTER ); + m_maxSkewBinder = std::make_unique( &m_unitsProvider, eventSource, nullptr, maxSkewField->GetControl(), + maxSkewField->GetLabel(), false, false ); + maxSkewField->SetUnitBinder( m_maxSkewBinder.get() ); + maxSkewField->GetControl()->SetValidator( VALIDATOR_NUMERIC_CTRL( false, false ) ); + + auto notifyModified = [this]( wxCommandEvent& ) + { + RULE_EDITOR_DIALOG_BASE* dlg = RULE_EDITOR_DIALOG_BASE::GetDialog( this ); + if( dlg ) + dlg->SetModified(); + }; + + minLengthField->GetControl()->Bind( wxEVT_TEXT, notifyModified ); + optLengthField->GetControl()->Bind( wxEVT_TEXT, notifyModified ); + maxLengthField->GetControl()->Bind( wxEVT_TEXT, notifyModified ); + maxSkewField->GetControl()->Bind( wxEVT_TEXT, notifyModified ); + + auto notifySave = [this]( wxCommandEvent& aEvent ) + { + RULE_EDITOR_DIALOG_BASE* dlg = RULE_EDITOR_DIALOG_BASE::GetDialog( this ); + if( dlg ) + dlg->OnSave( aEvent ); + }; + + minLengthField->GetControl()->Bind( wxEVT_TEXT_ENTER, notifySave ); + optLengthField->GetControl()->Bind( wxEVT_TEXT_ENTER, notifySave ); + maxLengthField->GetControl()->Bind( wxEVT_TEXT_ENTER, notifySave ); + maxSkewField->GetControl()->Bind( wxEVT_TEXT_ENTER, notifySave ); + + // Position all fields and update the panel layout + PositionFields(); + TransferDataToWindow(); +} + + +bool DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL::TransferDataToWindow() +{ + if( !m_data ) + return false; + + m_minLengthBinder->SetDoubleValue( pcbIUScale.mmToIU( m_data->GetMinimumLength() ) ); + m_optLengthBinder->SetDoubleValue( pcbIUScale.mmToIU( m_data->GetOptimumLength() ) ); + m_maxLengthBinder->SetDoubleValue( pcbIUScale.mmToIU( m_data->GetMaximumLength() ) ); + m_maxSkewBinder->SetDoubleValue( pcbIUScale.mmToIU( m_data->GetMaxSkew() ) ); + + return true; +} + + +bool DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL::TransferDataFromWindow() +{ + if( !m_data ) + return false; + + m_data->SetMinimumLength( pcbIUScale.IUTomm( m_minLengthBinder->GetDoubleValue() ) ); + m_data->SetOptimumLength( pcbIUScale.IUTomm( m_optLengthBinder->GetDoubleValue() ) ); + m_data->SetMaximumLength( pcbIUScale.IUTomm( m_maxLengthBinder->GetDoubleValue() ) ); + m_data->SetMaxSkew( pcbIUScale.IUTomm( m_maxSkewBinder->GetDoubleValue() ) ); + + return true; +} + + +bool DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL::ValidateInputs( int* aErrorCount, wxString* aValidationMessage ) +{ + TransferDataFromWindow(); + + VALIDATION_RESULT result = m_data->Validate(); + + if( !result.isValid ) + { + *aErrorCount = result.errors.size(); + + for( size_t i = 0; i < result.errors.size(); i++ ) + *aValidationMessage += DRC_RULE_EDITOR_UTILS::FormatErrorMessage( i + 1, result.errors[i] ); + + return false; + } + + return true; +} + + +wxString DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL::GenerateRule( const RULE_GENERATION_CONTEXT& aContext ) +{ + if( !m_data ) + return wxEmptyString; + + return m_data->GenerateRule( aContext ); +} diff --git a/pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.h b/pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.h new file mode 100644 index 0000000000..742d07a1d9 --- /dev/null +++ b/pcbnew/drc/rule_editor/drc_re_matched_length_diff_pair_overlay_panel.h @@ -0,0 +1,65 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL_H +#define DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL_H + +#include + +#include + +#include "drc_re_bitmap_overlay_panel.h" + +enum class EDA_UNITS; + +class DRC_RE_MATCHED_LENGTH_DIFF_PAIR_CONSTRAINT_DATA; +class UNIT_BINDER; + + +class DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL : public DRC_RE_BITMAP_OVERLAY_PANEL +{ +public: + DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL( wxWindow* aParent, + DRC_RE_MATCHED_LENGTH_DIFF_PAIR_CONSTRAINT_DATA* aData, + EDA_UNITS aUnits ); + + ~DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL() override = default; + + bool TransferDataToWindow() override; + bool TransferDataFromWindow() override; + + bool ValidateInputs( int* aErrorCount, wxString* aValidationMessage ) override; + wxString GenerateRule( const RULE_GENERATION_CONTEXT& aContext ) override; + +private: + DRC_RE_MATCHED_LENGTH_DIFF_PAIR_CONSTRAINT_DATA* m_data; + + UNITS_PROVIDER m_unitsProvider; + + std::unique_ptr m_minLengthBinder; + std::unique_ptr m_optLengthBinder; + std::unique_ptr m_maxLengthBinder; + std::unique_ptr m_maxSkewBinder; +}; + +#endif // DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL_H diff --git a/pcbnew/drc/rule_editor/panel_drc_rule_editor.cpp b/pcbnew/drc/rule_editor/panel_drc_rule_editor.cpp index 6ca28b7704..aefdb39a9a 100644 --- a/pcbnew/drc/rule_editor/panel_drc_rule_editor.cpp +++ b/pcbnew/drc/rule_editor/panel_drc_rule_editor.cpp @@ -61,6 +61,7 @@ #include "drc_re_numeric_input_overlay_panel.h" #include "drc_re_bool_input_overlay_panel.h" #include "drc_re_allowed_orientation_overlay_panel.h" +#include "drc_re_matched_length_diff_pair_overlay_panel.h" #include "drc_re_vias_under_smd_overlay_panel.h" #include "drc_re_permitted_layers_overlay_panel.h" @@ -382,6 +383,11 @@ PANEL_DRC_RULE_EDITOR::getConstraintPanel( wxWindow* aParent, const DRC_RULE_EDI aParent, dynamic_pointer_cast( m_constraintData ) ); case MATCHED_LENGTH_DIFF_PAIR: + return new DRC_RE_MATCHED_LENGTH_DIFF_PAIR_OVERLAY_PANEL( + aParent, + dynamic_pointer_cast( m_constraintData ).get(), + units ); + case ABSOLUTE_LENGTH: return new DRC_RE_ABS_LENGTH_TWO_OVERLAY_PANEL( aParent, diff --git a/resources/bitmaps_png/CMakeLists.txt b/resources/bitmaps_png/CMakeLists.txt index 5e1ca82e60..a73ffe0a70 100644 --- a/resources/bitmaps_png/CMakeLists.txt +++ b/resources/bitmaps_png/CMakeLists.txt @@ -730,6 +730,7 @@ set( BMAPS_CONSTRAINTS hole-to-hole-distance length matched-length-diff-pair + matched-length-diff-pair-v2 maximum-allowed-deviation maximum-via-count minimum-angular-ring diff --git a/resources/bitmaps_png/generate_themed_constraints.py b/resources/bitmaps_png/generate_themed_constraints.py index 325c8b4a4b..a0a1639e8f 100644 --- a/resources/bitmaps_png/generate_themed_constraints.py +++ b/resources/bitmaps_png/generate_themed_constraints.py @@ -52,6 +52,7 @@ CONSTRAINT_FILES = { 'solderpaste-expansion.svg': 'solderpaste-expansion.svg', 'maximum_allowed_deviation.svg': 'maximum-allowed-deviation.svg', 'matched-lenght-diff-pair.svg': 'matched-length-diff-pair.svg', + "matched-length-diff-pair-v2.svg": "matched-length-diff-pair-v2.svg", } diff --git a/resources/bitmaps_png/png/constraint_matched_length_diff_pair_v2.png b/resources/bitmaps_png/png/constraint_matched_length_diff_pair_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e81422e0d431560fc7973ce04351e6da9805bce GIT binary patch literal 16298 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 O0R>rQSow3)p#K-BTim$- literal 0 HcmV?d00001 diff --git a/resources/bitmaps_png/png/constraint_matched_length_diff_pair_v2_dark.png b/resources/bitmaps_png/png/constraint_matched_length_diff_pair_v2_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5e81422e0d431560fc7973ce04351e6da9805bce GIT binary patch literal 16298 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 O0R>rQSow3)p#K-BTim$- literal 0 HcmV?d00001 diff --git a/resources/bitmaps_png/sources/constraints/matched-length-diff-pair-v2.svg b/resources/bitmaps_png/sources/constraints/matched-length-diff-pair-v2.svg new file mode 100644 index 0000000000..d61a7d22f0 --- /dev/null +++ b/resources/bitmaps_png/sources/constraints/matched-length-diff-pair-v2.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/bitmaps_png/sources/dark/constraints/matched-length-diff-pair-v2.svg b/resources/bitmaps_png/sources/dark/constraints/matched-length-diff-pair-v2.svg new file mode 100644 index 0000000000..9873acd10a --- /dev/null +++ b/resources/bitmaps_png/sources/dark/constraints/matched-length-diff-pair-v2.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/bitmaps_png/sources/light/constraints/matched-length-diff-pair-v2.svg b/resources/bitmaps_png/sources/light/constraints/matched-length-diff-pair-v2.svg new file mode 100644 index 0000000000..d61a7d22f0 --- /dev/null +++ b/resources/bitmaps_png/sources/light/constraints/matched-length-diff-pair-v2.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +