Implement hierarchical component classes

This ensures that hierarchical sheets inside a rule are with a
component class attached pass that component class down the
schematic hierarchy.
This commit is contained in:
JamesJCode
2025-11-09 17:49:46 +00:00
parent ebc7529d08
commit 710a239c67
10 changed files with 2998 additions and 6 deletions
@@ -37,6 +37,7 @@
#include <xnode.h> // also nests: <wx/xml/xml.h>
#include <json_common.h>
#include <project_sch.h>
#include <sch_rule_area.h>
#include <trace_helpers.h>
#include <set>
@@ -253,6 +254,7 @@ XNODE* NETLIST_EXPORTER_XML::makeSymbols( unsigned aCtl )
m_referencesAlreadyFound.Clear();
m_libParts.clear();
getSheetComponentClasses();
SCH_SHEET_PATH currentSheet = m_schematic->CurrentSheet();
SCH_SHEET_LIST sheetList = m_schematic->Hierarchy();
@@ -572,21 +574,24 @@ XNODE* NETLIST_EXPORTER_XML::makeGroups()
std::vector<wxString> NETLIST_EXPORTER_XML::getComponentClassNamesForAllSymbolUnits(
SCH_SYMBOL* aSymbol, const SCH_SHEET_PATH& aSymbolSheet, const SCH_SHEET_LIST& aSheetList )
{
std::vector<SCH_SHEET_PATH> symbolSheets;
symbolSheets.push_back( aSymbolSheet );
std::unordered_set<wxString> compClassNames = aSymbol->GetComponentClassNames( &aSymbolSheet );
int primaryUnit = aSymbol->GetUnitSelection( &aSymbolSheet );
if( aSymbol->GetUnitCount() > 1 )
{
wxString ref = aSymbol->GetRef( &aSymbolSheet );
const wxString ref = aSymbol->GetRef( &aSymbolSheet );
for( const SCH_SHEET_PATH& sheet : aSheetList )
{
for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
{
SCH_SYMBOL* symbol2 = static_cast<SCH_SYMBOL*>( item );
const SCH_SYMBOL* symbol2 = static_cast<SCH_SYMBOL*>( item );
wxString ref2 = symbol2->GetRef( &sheet );
int otherUnit = symbol2->GetUnitSelection( &sheet );
wxString ref2 = symbol2->GetRef( &sheet );
const int otherUnit = symbol2->GetUnitSelection( &sheet );
if( ref2.CmpNoCase( ref ) != 0 )
continue;
@@ -594,6 +599,8 @@ std::vector<wxString> NETLIST_EXPORTER_XML::getComponentClassNamesForAllSymbolUn
if( otherUnit == primaryUnit )
continue;
symbolSheets.push_back( sheet );
std::unordered_set<wxString> otherClassNames =
symbol2->GetComponentClassNames( &sheet );
compClassNames.insert( otherClassNames.begin(), otherClassNames.end() );
@@ -601,6 +608,18 @@ std::vector<wxString> NETLIST_EXPORTER_XML::getComponentClassNamesForAllSymbolUn
}
}
// Add sheet-level component classes
for( auto& [sheetPath, sheetCompClasses] : m_sheetComponentClasses )
{
for( SCH_SHEET_PATH& symbolSheetPath : symbolSheets )
{
if( symbolSheetPath.IsContainedWithin( sheetPath ) )
{
compClassNames.insert( sheetCompClasses.begin(), sheetCompClasses.end() );
}
}
}
std::vector<wxString> sortedCompClassNames( compClassNames.begin(), compClassNames.end() );
std::sort( sortedCompClassNames.begin(), sortedCompClassNames.end(),
[]( const wxString& str1, const wxString& str2 )
@@ -1100,3 +1119,51 @@ static bool sortPinsByNumber( SCH_PIN* aPin1, SCH_PIN* aPin2 )
// return "lhs < rhs"
return StrNumCmp( aPin1->GetShownNumber(), aPin2->GetShownNumber(), true ) < 0;
}
void NETLIST_EXPORTER_XML::getSheetComponentClasses()
{
m_sheetComponentClasses.clear();
SCH_SHEET_LIST sheetList = m_schematic->Hierarchy();
auto getComponentClassFields = [&]( const std::vector<SCH_FIELD>& fields, const SCH_SHEET_PATH* sheetPath )
{
std::unordered_set<wxString> componentClasses;
for( const SCH_FIELD& field : fields )
{
if( field.GetCanonicalName() == wxT( "Component Class" ) )
{
if( field.GetShownText( sheetPath, false ) != wxEmptyString )
componentClasses.insert( field.GetShownText( sheetPath, false ) );
}
}
return componentClasses;
};
for( const SCH_SHEET_PATH& sheet : sheetList )
{
for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_SHEET_T ) )
{
SCH_SHEET* sheetItem = static_cast<SCH_SHEET*>( item );
std::unordered_set<wxString> sheetComponentClasses;
const std::unordered_set<SCH_RULE_AREA*>& sheetRuleAreas = sheetItem->GetRuleAreaCache();
for( const SCH_RULE_AREA* ruleArea : sheetRuleAreas )
{
for( const SCH_DIRECTIVE_LABEL* label : ruleArea->GetDirectives() )
{
std::unordered_set<wxString> ruleAreaComponentClasses =
getComponentClassFields( label->GetFields(), &sheet );
sheetComponentClasses.insert( ruleAreaComponentClasses.begin(), ruleAreaComponentClasses.end() );
}
}
SCH_SHEET_PATH newPath = sheet;
newPath.push_back( sheetItem );
wxASSERT( !m_sheetComponentClasses.contains( newPath ) );
m_sheetComponentClasses[newPath] = sheetComponentClasses;
}
}
}
@@ -148,7 +148,12 @@ protected:
bool m_resolveTextVars; // Export textVar references resolved
private:
void getSheetComponentClasses();
std::set<wxString> m_libraries; // Set of library nicknames.
/// Map of all sheets to component classes covering the whole sheet
std::map<SCH_SHEET_PATH, std::unordered_set<wxString>> m_sheetComponentClasses;
};
#endif
+11 -1
View File
@@ -250,7 +250,7 @@ void SCH_RULE_AREA::RefreshContainedItemsAndDirectives( SCH_SCREEN* screen )
{ SCH_PIN_T, SCH_LABEL_T, SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T } ) )
{
std::vector<VECTOR2I> connectionPoints = areaItem->GetConnectionPoints();
assert( connectionPoints.size() == 1 );
wxASSERT( connectionPoints.size() == 1 );
if( GetPolyShape().Collide( connectionPoints[0] ) )
addContainedItem( areaItem );
@@ -273,6 +273,16 @@ void SCH_RULE_AREA::RefreshContainedItemsAndDirectives( SCH_SCREEN* screen )
}
}
}
else if( areaItem->IsType( { SCH_SHEET_T } ) )
{
const BOX2I sheetBb = areaItem->GetBoundingBox();
const SHAPE_RECT rect( sheetBb );
if( GetPolyShape().Collide( &rect ) )
{
addContainedItem( areaItem );
}
}
}
}
@@ -0,0 +1,209 @@
(kicad_sch
(version 20251012)
(generator "eeschema")
(generator_version "9.99")
(uuid "ea1f8edf-1e60-4f48-ba74-503c3b406cfc")
(paper "A4")
(lib_symbols
(symbol "Device:R"
(pin_numbers
(hide yes)
)
(pin_names
(offset 0)
)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(duplicate_pin_numbers_are_jumpers no)
(property "Reference" "R"
(at 2.032 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Value" "R"
(at 0 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Footprint" ""
(at -1.778 0 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_keywords" "R res resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_fp_filters" "R_*"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(symbol "R_0_1"
(rectangle
(start -1.016 -2.54)
(end 1.016 2.54)
(stroke
(width 0.254)
(type default)
)
(fill
(type none)
)
)
)
(symbol "R_1_1"
(pin passive line
(at 0 3.81 270)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "1"
(effects
(font
(size 1.27 1.27)
)
)
)
)
(pin passive line
(at 0 -3.81 90)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "2"
(effects
(font
(size 1.27 1.27)
)
)
)
)
)
(embedded_fonts no)
)
)
(symbol
(lib_id "Device:R")
(at 186.69 83.82 0)
(unit 1)
(body_style 1)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(uuid "730bdc9b-2ca6-40b5-b487-73fa752f3460")
(property "Reference" "R5"
(at 189.23 82.5499 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Value" "R"
(at 189.23 85.0899 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Footprint" "Resistor_SMD:R_0603_1608Metric"
(at 184.912 83.82 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 186.69 83.82 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 186.69 83.82 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(pin "1"
(uuid "9ea6f0eb-f681-44ca-9401-3770eb115fb6")
)
(pin "2"
(uuid "02972978-fcea-4d0c-a5b1-2a0ddee61e91")
)
(instances
(project "sheets"
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/6e2d3d35-be93-4ad1-8bb1-3b2b72490946/8351e9a1-a2eb-4ba2-a99c-2f841ef19af3/72b63f92-8b9b-4056-b86f-2bd89069bb4f"
(reference "R6")
(unit 1)
)
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/aa6e1b5b-448e-4d6b-8c0f-36a7705eb7cb/8351e9a1-a2eb-4ba2-a99c-2f841ef19af3/72b63f92-8b9b-4056-b86f-2bd89069bb4f"
(reference "R5")
(unit 1)
)
)
)
)
)
@@ -0,0 +1,667 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_barcodes": false,
"apply_defaults_to_fp_dimensions": false,
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": true,
"text_position": 0,
"units_format": 0
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"creepage": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"mirrored_text_on_front_layer": "warning",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"missing_tuning_profile": "warning",
"net_conflict": "warning",
"nonmirrored_text_on_back_layer": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_on_edge_cuts": "error",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_angle": "error",
"track_dangling": "warning",
"track_segment_length": "error",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_groove_width": 0.0,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpthpad": true,
"td_onroundshapesonly": false,
"td_onsmdpad": true,
"td_ontrackend": false,
"td_onvia": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"component_class_settings": {
"assignments": [],
"meta": {
"version": 0
},
"sheet_component_classes": {
"enabled": false
}
},
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"footprint_filter": "ignore",
"footprint_link_issues": "warning",
"four_way_junction": "ignore",
"ground_pin_not_ground": "warning",
"hier_label_mismatch": "error",
"isolated_pin_label": "warning",
"label_dangling": "error",
"label_multiple_wires": "warning",
"lib_symbol_issues": "warning",
"lib_symbol_mismatch": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"same_local_global_label": "warning",
"similar_label_and_power": "warning",
"similar_labels": "warning",
"similar_power": "warning",
"simulation_model_issue": "ignore",
"single_global_label": "ignore",
"stacked_pin_name": "warning",
"unannotated": "error",
"unconnected_wire_endpoint": "warning",
"undefined_netclass": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "hierarchical_component_classes.kicad_pro",
"version": 3
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": 2147483647,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"tuning_profile": "",
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 5
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"idf": "",
"netlist": "",
"plot": "",
"specctra_dsn": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"annotation": {
"method": 0,
"sort_order": 0
},
"bom_export_filename": "${PROJECTNAME}.csv",
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
},
{
"group_by": true,
"label": "Exclude from BOM",
"name": "${EXCLUDE_FROM_BOM}",
"show": true
},
{
"group_by": true,
"label": "Exclude from Board",
"name": "${EXCLUDE_FROM_BOARD}",
"show": true
},
{
"group_by": true,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"include_excluded_from_bom": true,
"name": "Default Editing",
"sort_asc": true,
"sort_field": "Reference"
},
"bus_aliases": {},
"connection_grid_size": 50.0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"hop_over_size_choice": 0,
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"overbar_offset_ratio": 1.23,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"page_layout_descr_file": "",
"plot_directory": "",
"reuse_designators": true,
"subpart_first_id": 65,
"subpart_id_separator": 0,
"top_level_sheets": [
{
"filename": "hierarchical_component_classes.kicad_sch",
"name": "",
"uuid": "bde4f0aa-7cf7-4740-8df5-de6575c32a07"
}
],
"used_designators": "R1-8"
},
"sheets": [
[
"bde4f0aa-7cf7-4740-8df5-de6575c32a07",
""
],
[
"6e2d3d35-be93-4ad1-8bb1-3b2b72490946",
"SHEET_1"
],
[
"aa6e1b5b-448e-4d6b-8c0f-36a7705eb7cb",
"SHEET_2"
],
[
"8351e9a1-a2eb-4ba2-a99c-2f841ef19af3",
"SHEET_3"
],
[
"72b63f92-8b9b-4056-b86f-2bd89069bb4f",
"Another_Sheet"
],
[
"72b63f92-8b9b-4056-b86f-2bd89069bb4f",
"Another_Sheet"
],
[
"8351e9a1-a2eb-4ba2-a99c-2f841ef19af3",
"SHEET_3"
]
],
"text_variables": {},
"tuning_profiles": {
"meta": {
"version": 0
},
"tuning_profiles_impedance_geometric": []
}
}
@@ -0,0 +1,466 @@
(kicad_sch
(version 20251012)
(generator "eeschema")
(generator_version "9.99")
(uuid "bde4f0aa-7cf7-4740-8df5-de6575c32a07")
(paper "A4")
(lib_symbols
(symbol "Device:R"
(pin_numbers
(hide yes)
)
(pin_names
(offset 0)
)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(duplicate_pin_numbers_are_jumpers no)
(property "Reference" "R"
(at 2.032 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Value" "R"
(at 0 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Footprint" ""
(at -1.778 0 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_keywords" "R res resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_fp_filters" "R_*"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(symbol "R_0_1"
(rectangle
(start -1.016 -2.54)
(end 1.016 2.54)
(stroke
(width 0.254)
(type default)
)
(fill
(type none)
)
)
)
(symbol "R_1_1"
(pin passive line
(at 0 3.81 270)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "1"
(effects
(font
(size 1.27 1.27)
)
)
)
)
(pin passive line
(at 0 -3.81 90)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "2"
(effects
(font
(size 1.27 1.27)
)
)
)
)
)
(embedded_fonts no)
)
)
(rule_area
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(polyline
(pts
(xy 223.52 20.32) (xy 223.52 74.93) (xy 113.03 74.93) (xy 113.03 20.32)
)
(stroke
(width 0)
(type dash)
)
(fill
(type none)
)
(uuid "aa3afb3a-de72-4403-b1fb-e2ba3ae2c864")
)
)
(rule_area
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(polyline
(pts
(xy 217.17 88.9) (xy 217.17 139.7) (xy 215.9 140.97) (xy 114.3 140.97) (xy 114.3 88.9)
)
(stroke
(width 0)
(type dash)
)
(fill
(type none)
)
(uuid "d60c88eb-88ea-4112-b292-8b5cd072017c")
)
)
(netclass_flag ""
(length 2.54)
(shape round)
(at 135.89 20.32 0)
(fields_autoplaced yes)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
(uuid "19b695d4-87e1-4f0a-97d5-e08c562d66ab")
(property "Net Class" ""
(at -153.67 -34.29 0)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Component Class" "CLASS_1"
(at 136.5885 17.78 0)
(effects
(font
(size 1.27 1.27)
(italic yes)
)
(justify left)
)
)
)
(netclass_flag ""
(length 2.54)
(shape round)
(at 140.97 88.9 0)
(fields_autoplaced yes)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
(uuid "dc7a52ef-7b96-43c4-9455-4aad87ca05b6")
(property "Net Class" ""
(at -148.59 34.29 0)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Component Class" "CLASS_2"
(at 141.6685 86.36 0)
(effects
(font
(size 1.27 1.27)
(italic yes)
)
(justify left)
)
)
)
(symbol
(lib_id "Device:R")
(at 204.47 116.84 0)
(unit 1)
(body_style 1)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(uuid "93632e7c-0edc-48d4-b65b-13448defa02c")
(property "Reference" "R8"
(at 207.01 115.5699 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Value" "R"
(at 207.01 118.1099 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Footprint" "Resistor_SMD:R_0603_1608Metric"
(at 202.692 116.84 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 204.47 116.84 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 204.47 116.84 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(pin "1"
(uuid "76b2a78a-dde0-4aac-afce-567e1ce44a30")
)
(pin "2"
(uuid "19969132-0668-4035-b6b7-8f948f5b61d2")
)
(instances
(project "sheets"
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07"
(reference "R8")
(unit 1)
)
)
)
)
(symbol
(lib_id "Device:R")
(at 207.01 49.53 0)
(unit 1)
(body_style 1)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(uuid "c854fc14-f20c-423e-8ded-eb0b49ef9a68")
(property "Reference" "R7"
(at 209.55 48.2599 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Value" "R"
(at 209.55 50.7999 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Footprint" "Resistor_SMD:R_0603_1608Metric"
(at 205.232 49.53 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 207.01 49.53 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 207.01 49.53 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(pin "1"
(uuid "943d3cd0-3634-4c13-97b6-bee2546c1084")
)
(pin "2"
(uuid "f35d6f06-f946-46f7-be65-153cebc32c1c")
)
(instances
(project "sheets"
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07"
(reference "R7")
(unit 1)
)
)
)
)
(sheet
(at 119.38 31.75)
(size 69.85 36.83)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke
(width 0.1524)
(type solid)
)
(fill
(color 0 0 0 0)
)
(uuid "6e2d3d35-be93-4ad1-8bb1-3b2b72490946")
(property "Sheetname" "SHEET_1"
(at 119.38 31.0384 0)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
)
(property "Sheetfile" "subsheet_1.kicad_sch"
(at 119.38 69.1646 0)
(effects
(font
(size 1.27 1.27)
)
(justify left top)
)
)
(instances
(project ""
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07"
(page "2")
)
)
)
)
(sheet
(at 119.38 95.25)
(size 69.85 36.83)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke
(width 0.1524)
(type solid)
)
(fill
(color 0 0 0 0)
)
(uuid "aa6e1b5b-448e-4d6b-8c0f-36a7705eb7cb")
(property "Sheetname" "SHEET_2"
(at 119.38 94.5384 0)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
)
(property "Sheetfile" "subsheet_1.kicad_sch"
(at 119.38 132.6646 0)
(effects
(font
(size 1.27 1.27)
)
(justify left top)
)
)
(instances
(project "sheets"
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07"
(page "3")
)
)
)
)
(sheet_instances
(path "/"
(page "1")
)
)
(embedded_fonts no)
)
@@ -0,0 +1,251 @@
(kicad_sch
(version 20251012)
(generator "eeschema")
(generator_version "9.99")
(uuid "375bbda3-09dc-4a5d-a2f3-892747f29935")
(paper "A4")
(lib_symbols
(symbol "Device:R"
(pin_numbers
(hide yes)
)
(pin_names
(offset 0)
)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(duplicate_pin_numbers_are_jumpers no)
(property "Reference" "R"
(at 2.032 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Value" "R"
(at 0 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Footprint" ""
(at -1.778 0 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_keywords" "R res resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_fp_filters" "R_*"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(symbol "R_0_1"
(rectangle
(start -1.016 -2.54)
(end 1.016 2.54)
(stroke
(width 0.254)
(type default)
)
(fill
(type none)
)
)
)
(symbol "R_1_1"
(pin passive line
(at 0 3.81 270)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "1"
(effects
(font
(size 1.27 1.27)
)
)
)
)
(pin passive line
(at 0 -3.81 90)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "2"
(effects
(font
(size 1.27 1.27)
)
)
)
)
)
(embedded_fonts no)
)
)
(symbol
(lib_id "Device:R")
(at 144.78 96.52 0)
(unit 1)
(body_style 1)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(uuid "6312dea8-7205-4212-8c2b-93068c7fc869")
(property "Reference" "R3"
(at 147.32 95.2499 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Value" "R"
(at 147.32 97.7899 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Footprint" "Resistor_SMD:R_0603_1608Metric"
(at 143.002 96.52 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 144.78 96.52 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 144.78 96.52 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(pin "1"
(uuid "1d14e643-4ed3-4201-875a-17e42e0b1a56")
)
(pin "2"
(uuid "6679c4ad-4e66-43c3-929c-48a91f4bbe5c")
)
(instances
(project "sheets"
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/6e2d3d35-be93-4ad1-8bb1-3b2b72490946/8351e9a1-a2eb-4ba2-a99c-2f841ef19af3"
(reference "R3")
(unit 1)
)
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/aa6e1b5b-448e-4d6b-8c0f-36a7705eb7cb/8351e9a1-a2eb-4ba2-a99c-2f841ef19af3"
(reference "R4")
(unit 1)
)
)
)
)
(sheet
(at 186.69 68.58)
(size 46.99 29.21)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke
(width 0.1524)
(type solid)
)
(fill
(color 0 0 0 0)
)
(uuid "72b63f92-8b9b-4056-b86f-2bd89069bb4f")
(property "Sheetname" "Another_Sheet"
(at 186.69 67.8684 0)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
)
(property "Sheetfile" "another_sheet.kicad_sch"
(at 186.69 98.3746 0)
(effects
(font
(size 1.27 1.27)
)
(justify left top)
)
)
(instances
(project ""
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/aa6e1b5b-448e-4d6b-8c0f-36a7705eb7cb/8351e9a1-a2eb-4ba2-a99c-2f841ef19af3"
(page "5")
)
)
)
)
)
@@ -0,0 +1,301 @@
(kicad_sch
(version 20251012)
(generator "eeschema")
(generator_version "9.99")
(uuid "5c18b1c3-5d06-483c-bce6-927ba4859ed2")
(paper "A4")
(lib_symbols
(symbol "Device:R"
(pin_numbers
(hide yes)
)
(pin_names
(offset 0)
)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(duplicate_pin_numbers_are_jumpers no)
(property "Reference" "R"
(at 2.032 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Value" "R"
(at 0 0 90)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Footprint" ""
(at -1.778 0 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_keywords" "R res resistor"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "ki_fp_filters" "R_*"
(at 0 0 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(symbol "R_0_1"
(rectangle
(start -1.016 -2.54)
(end 1.016 2.54)
(stroke
(width 0.254)
(type default)
)
(fill
(type none)
)
)
)
(symbol "R_1_1"
(pin passive line
(at 0 3.81 270)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "1"
(effects
(font
(size 1.27 1.27)
)
)
)
)
(pin passive line
(at 0 -3.81 90)
(length 1.27)
(name ""
(effects
(font
(size 1.27 1.27)
)
)
)
(number "2"
(effects
(font
(size 1.27 1.27)
)
)
)
)
)
(embedded_fonts no)
)
)
(rule_area
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(polyline
(pts
(xy 127 34.29) (xy 195.58 34.29) (xy 195.58 91.44) (xy 127 91.44)
)
(stroke
(width 0)
(type dash)
)
(fill
(type none)
)
(uuid "5aefaf21-deec-4e8f-ab94-eb402769206f")
)
)
(netclass_flag ""
(length 2.54)
(shape round)
(at 135.89 34.29 0)
(fields_autoplaced yes)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
(uuid "42e2089b-d7e9-4bb7-a7c5-835f9ed55531")
(property "Net Class" ""
(at -142.24 13.97 0)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Component Class" "CLASS_3"
(at 136.5885 31.75 0)
(effects
(font
(size 1.27 1.27)
(italic yes)
)
(justify left)
)
)
)
(symbol
(lib_id "Device:R")
(at 97.79 52.07 0)
(unit 1)
(body_style 1)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(uuid "bf318324-2825-47aa-971c-27177a46b6a1")
(property "Reference" "R1"
(at 100.33 50.7999 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Value" "R"
(at 100.33 53.3399 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Footprint" "Resistor_SMD:R_0603_1608Metric"
(at 96.012 52.07 90)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Datasheet" ""
(at 97.79 52.07 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(property "Description" "Resistor"
(at 97.79 52.07 0)
(hide yes)
(effects
(font
(size 1.27 1.27)
)
)
)
(pin "1"
(uuid "6de42da5-7876-4c7a-a7b4-ac09e428b309")
)
(pin "2"
(uuid "b31a9981-4f66-4713-8f9c-5cbc94630d0e")
)
(instances
(project ""
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/6e2d3d35-be93-4ad1-8bb1-3b2b72490946"
(reference "R1")
(unit 1)
)
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/aa6e1b5b-448e-4d6b-8c0f-36a7705eb7cb"
(reference "R2")
(unit 1)
)
)
)
)
(sheet
(at 134.62 43.18)
(size 52.07 34.29)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke
(width 0.1524)
(type solid)
)
(fill
(color 0 0 0 0)
)
(uuid "8351e9a1-a2eb-4ba2-a99c-2f841ef19af3")
(property "Sheetname" "SHEET_3"
(at 134.62 42.4684 0)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
)
(property "Sheetfile" "sheet_3.kicad_sch"
(at 134.62 78.0546 0)
(effects
(font
(size 1.27 1.27)
)
(justify left top)
)
)
(instances
(project ""
(path "/bde4f0aa-7cf7-4740-8df5-de6575c32a07/6e2d3d35-be93-4ad1-8bb1-3b2b72490946"
(page "4")
)
)
)
)
)
@@ -90,7 +90,7 @@ public:
BOOST_REQUIRE_EQUAL( goldenNet.GetPinType(), testNet.GetPinType() );
}
// And the the resolved component class is the same
// And the resolved component class is the same
BOOST_REQUIRE( goldenComp->GetComponentClassNames()
== refComp->GetComponentClassNames() );
}
@@ -220,6 +220,11 @@ BOOST_AUTO_TEST_CASE( ComponentClasses )
TestNetlist( "component_classes" );
}
BOOST_AUTO_TEST_CASE( HierarchicalComponentClasses )
{
TestNetlist( "hierarchical_component_classes" );
}
BOOST_AUTO_TEST_CASE( Jumpers )
{