pcb-dfm 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. pcb_dfm/__init__.py +20 -0
  2. pcb_dfm/__main__.py +6 -0
  3. pcb_dfm/check_data/categories.json +55 -0
  4. pcb_dfm/check_data/checks/acid_trap_angle.json +24 -0
  5. pcb_dfm/check_data/checks/aperture_definition_errors.json +24 -0
  6. pcb_dfm/check_data/checks/backdrill_stub_length.json +24 -0
  7. pcb_dfm/check_data/checks/component_to_component_spacing.json +24 -0
  8. pcb_dfm/check_data/checks/copper_density_balance.json +24 -0
  9. pcb_dfm/check_data/checks/copper_sliver_width.json +24 -0
  10. pcb_dfm/check_data/checks/copper_thermal_area.json +24 -0
  11. pcb_dfm/check_data/checks/copper_to_edge_distance.json +24 -0
  12. pcb_dfm/check_data/checks/crosstalk_estimate.json +24 -0
  13. pcb_dfm/check_data/checks/dielectric_thickness_uniformity.json +24 -0
  14. pcb_dfm/check_data/checks/diff_pair_skew.json +24 -0
  15. pcb_dfm/check_data/checks/diff_pair_spacing.json +24 -0
  16. pcb_dfm/check_data/checks/drill_aspect_ratio.json +24 -0
  17. pcb_dfm/check_data/checks/drill_to_drill_spacing.json +24 -0
  18. pcb_dfm/check_data/checks/drill_wander_budget.json +24 -0
  19. pcb_dfm/check_data/checks/etch_compensation_margin.json +24 -0
  20. pcb_dfm/check_data/checks/fillet_radius_milling.json +24 -0
  21. pcb_dfm/check_data/checks/highspeed_stub_length.json +24 -0
  22. pcb_dfm/check_data/checks/impedance_control.json +24 -0
  23. pcb_dfm/check_data/checks/index.json +231 -0
  24. pcb_dfm/check_data/checks/layer_registration_margin.json +24 -0
  25. pcb_dfm/check_data/checks/mask_to_trace_clearance.json +24 -0
  26. pcb_dfm/check_data/checks/min_annular_ring.json +24 -0
  27. pcb_dfm/check_data/checks/min_drill_size.json +24 -0
  28. pcb_dfm/check_data/checks/min_slot_width.json +24 -0
  29. pcb_dfm/check_data/checks/min_trace_spacing.json +24 -0
  30. pcb_dfm/check_data/checks/min_trace_width.json +24 -0
  31. pcb_dfm/check_data/checks/missing_tooling_holes.json +21 -0
  32. pcb_dfm/check_data/checks/plane_fragmentation.json +24 -0
  33. pcb_dfm/check_data/checks/plating_uniformity.json +24 -0
  34. pcb_dfm/check_data/checks/polarity_marking_consistency.json +21 -0
  35. pcb_dfm/check_data/checks/return_path_interruptions.json +24 -0
  36. pcb_dfm/check_data/checks/silkscreen_min_width.json +24 -0
  37. pcb_dfm/check_data/checks/silkscreen_on_copper.json +24 -0
  38. pcb_dfm/check_data/checks/silkscreen_over_mask_defined_pads.json +24 -0
  39. pcb_dfm/check_data/checks/solder_mask_expansion.json +24 -0
  40. pcb_dfm/check_data/checks/solder_mask_web.json +24 -0
  41. pcb_dfm/check_data/checks/solder_paste_area_coverage.json +24 -0
  42. pcb_dfm/check_data/checks/tab_routing_mousebites.json +24 -0
  43. pcb_dfm/check_data/checks/thermal_relief_spoke_width.json +24 -0
  44. pcb_dfm/check_data/checks/tombstoning_risk.json +24 -0
  45. pcb_dfm/check_data/checks/unsupported_hole_types.json +21 -0
  46. pcb_dfm/check_data/checks/via_in_pad_thermal_balance.json +24 -0
  47. pcb_dfm/check_data/checks/via_tenting.json +21 -0
  48. pcb_dfm/check_data/checks/via_to_copper_clearance.json +24 -0
  49. pcb_dfm/check_data/checks/wave_solder_shadowing.json +24 -0
  50. pcb_dfm/check_data/rulesets/advanced_hdi.json +21 -0
  51. pcb_dfm/check_data/rulesets/conservative_2layer.json +22 -0
  52. pcb_dfm/check_data/rulesets/default.json +14 -0
  53. pcb_dfm/check_data/rulesets/jlcpcb_2layer.json +19 -0
  54. pcb_dfm/check_data/rulesets/jlcpcb_4layer.json +18 -0
  55. pcb_dfm/check_data/rulesets/oshpark.json +19 -0
  56. pcb_dfm/check_data/rulesets/pcbway.json +18 -0
  57. pcb_dfm/checks/__init__.py +103 -0
  58. pcb_dfm/checks/definitions.py +227 -0
  59. pcb_dfm/checks/impl_acid_trap_angle.py +263 -0
  60. pcb_dfm/checks/impl_aperture_definition_errors.py +586 -0
  61. pcb_dfm/checks/impl_backdrill_stub_length.py +55 -0
  62. pcb_dfm/checks/impl_component_to_component_spacing.py +541 -0
  63. pcb_dfm/checks/impl_copper_density_balance.py +371 -0
  64. pcb_dfm/checks/impl_copper_sliver_width.py +201 -0
  65. pcb_dfm/checks/impl_copper_thermal_area.py +260 -0
  66. pcb_dfm/checks/impl_copper_to_edge_distance.py +213 -0
  67. pcb_dfm/checks/impl_dielectric_thickness_uniformity.py +93 -0
  68. pcb_dfm/checks/impl_diff_pair_skew.py +101 -0
  69. pcb_dfm/checks/impl_diff_pair_spacing.py +149 -0
  70. pcb_dfm/checks/impl_drill_aspect_ratio.py +187 -0
  71. pcb_dfm/checks/impl_drill_to_drill_spacing.py +299 -0
  72. pcb_dfm/checks/impl_drill_wander_budget.py +224 -0
  73. pcb_dfm/checks/impl_fillet_radius_milling.py +301 -0
  74. pcb_dfm/checks/impl_impedance_control.py +136 -0
  75. pcb_dfm/checks/impl_mask_to_trace_clearance.py +272 -0
  76. pcb_dfm/checks/impl_min_annular_ring.py +468 -0
  77. pcb_dfm/checks/impl_min_drill_size.py +239 -0
  78. pcb_dfm/checks/impl_min_slot_width.py +199 -0
  79. pcb_dfm/checks/impl_min_trace_spacing.py +409 -0
  80. pcb_dfm/checks/impl_min_trace_width.py +246 -0
  81. pcb_dfm/checks/impl_missing_tooling_holes.py +304 -0
  82. pcb_dfm/checks/impl_plane_fragmentation.py +305 -0
  83. pcb_dfm/checks/impl_silkscreen_min_width.py +177 -0
  84. pcb_dfm/checks/impl_silkscreen_on_copper.py +438 -0
  85. pcb_dfm/checks/impl_silkscreen_over_mask_defined_pads.py +217 -0
  86. pcb_dfm/checks/impl_solder_mask_expansion.py +533 -0
  87. pcb_dfm/checks/impl_solder_mask_web.py +261 -0
  88. pcb_dfm/checks/impl_solder_paste_area_coverage.py +251 -0
  89. pcb_dfm/checks/impl_tab_routing_mousebites.py +234 -0
  90. pcb_dfm/checks/impl_thermal_relief_spoke_width.py +192 -0
  91. pcb_dfm/checks/impl_unsupported_hole_types.py +226 -0
  92. pcb_dfm/checks/impl_via_in_pad_thermal_balance.py +486 -0
  93. pcb_dfm/checks/impl_via_tenting.py +252 -0
  94. pcb_dfm/checks/impl_via_to_copper_clearance.py +551 -0
  95. pcb_dfm/cli/__init__.py +3 -0
  96. pcb_dfm/cli/main.py +212 -0
  97. pcb_dfm/engine/__init__.py +13 -0
  98. pcb_dfm/engine/check_defs.py +40 -0
  99. pcb_dfm/engine/check_runner.py +294 -0
  100. pcb_dfm/engine/context.py +36 -0
  101. pcb_dfm/engine/geometry_cache.py +66 -0
  102. pcb_dfm/engine/run.py +310 -0
  103. pcb_dfm/geometry/__init__.py +16 -0
  104. pcb_dfm/geometry/gerber_compat.py +42 -0
  105. pcb_dfm/geometry/gerber_parser.py +480 -0
  106. pcb_dfm/geometry/layer_model.py +85 -0
  107. pcb_dfm/geometry/polygon_index.py +246 -0
  108. pcb_dfm/geometry/primitives.py +58 -0
  109. pcb_dfm/geometry/queries.py +78 -0
  110. pcb_dfm/ingest/__init__.py +15 -0
  111. pcb_dfm/ingest/adapters/__init__.py +7 -0
  112. pcb_dfm/ingest/adapters/ipc2581.py +235 -0
  113. pcb_dfm/ingest/adapters/sidecar.py +144 -0
  114. pcb_dfm/ingest/aperture_validation.py +332 -0
  115. pcb_dfm/ingest/design_data.py +53 -0
  116. pcb_dfm/ingest/design_model.py +139 -0
  117. pcb_dfm/ingest/gerber_zip.py +533 -0
  118. pcb_dfm/io/__init__.py +42 -0
  119. pcb_dfm/io/cam_bundle.py +129 -0
  120. pcb_dfm/report.py +393 -0
  121. pcb_dfm/results.py +298 -0
  122. pcb_dfm-0.4.0.dist-info/METADATA +786 -0
  123. pcb_dfm-0.4.0.dist-info/RECORD +127 -0
  124. pcb_dfm-0.4.0.dist-info/WHEEL +5 -0
  125. pcb_dfm-0.4.0.dist-info/entry_points.txt +2 -0
  126. pcb_dfm-0.4.0.dist-info/licenses/LICENSE +201 -0
  127. pcb_dfm-0.4.0.dist-info/top_level.txt +1 -0
pcb_dfm/__init__.py ADDED
@@ -0,0 +1,20 @@
1
+ """
2
+ pcb_dfm package init.
3
+
4
+ For now we keep the public API minimal so that internal modules
5
+ like pcb_dfm.engine.* can be imported without pulling in extra
6
+ dependencies or failing on missing symbols.
7
+ """
8
+
9
+ import logging
10
+
11
+ from .results import CheckResult, DfmResult
12
+
13
+ # Library convention: attach a NullHandler so importing pcb_dfm never emits log
14
+ # output on its own. Applications (and the CLI) opt in by configuring handlers.
15
+ logging.getLogger("pcb_dfm").addHandler(logging.NullHandler())
16
+
17
+ __all__ = [
18
+ "CheckResult",
19
+ "DfmResult",
20
+ ]
pcb_dfm/__main__.py ADDED
@@ -0,0 +1,6 @@
1
+ import sys
2
+
3
+ from .cli.main import main
4
+
5
+ if __name__ == "__main__":
6
+ sys.exit(main())
@@ -0,0 +1,55 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "categories": [
4
+ {
5
+ "id": "copper_geometry",
6
+ "name": "Copper geometry",
7
+ "description": "Trace widths, clearances, annular rings, copper balancing, slivers and general photolithography or etch related constraints."
8
+ },
9
+ {
10
+ "id": "drill_via_integrity",
11
+ "name": "Drill and via integrity",
12
+ "description": "Drill sizes, via annular rings, aspect ratio, spacing, tenting, and other drill process constraints."
13
+ },
14
+ {
15
+ "id": "solder_mask_silkscreen",
16
+ "name": "Solder mask and silkscreen",
17
+ "description": "Mask openings, mask clearance, mask webbing, silkscreen printability, and mask defined pad constraints."
18
+ },
19
+ {
20
+ "id": "fabrication_stackup",
21
+ "name": "Fabrication stackup",
22
+ "description": "Dielectric thickness, material specs, layer registration, impedance controlled structures, and copper to edge constraints."
23
+ },
24
+ {
25
+ "id": "mechanical_outline",
26
+ "name": "Mechanical and outline",
27
+ "description": "Board outline, milling, slots, corner radii, tabs, mousebites, and mechanical drill features."
28
+ },
29
+ {
30
+ "id": "assembly",
31
+ "name": "Assembly",
32
+ "description": "Component spacing, polarity, reflow considerations, paste area, tombstoning, and wave solder constraints."
33
+ },
34
+ {
35
+ "id": "thermal_power",
36
+ "name": "Thermal and power integrity",
37
+ "description": "Thermal reliefs, copper areas for heat dissipation, plane fragmentation, and via in pad thermal management."
38
+ },
39
+ {
40
+ "id": "high_speed_si",
41
+ "name": "High speed and signal integrity",
42
+ "description": "Differential pair spacing and skew, return path continuity, stub length, and crosstalk prediction."
43
+ },
44
+ {
45
+ "id": "fab_process_compatibility",
46
+ "name": "Fabrication process compatibility",
47
+ "description": "Non standard hole types, missing tooling, silkscreen issues, and aperture definition errors."
48
+ },
49
+ {
50
+ "id": "yield_prediction",
51
+ "name": "Yield prediction",
52
+ "description": "Quantitative estimates of etch margin, drill wander tolerance, and plating thickness uniformity."
53
+ }
54
+ ]
55
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "acid_trap_angle",
3
+ "category_id": "copper_geometry",
4
+ "name": "Minimum copper corner angle",
5
+ "description": "Detect acute copper angles that could create acid traps during etching.",
6
+ "what_it_measures": "Smallest internal copper corner angle found in traces and pours.",
7
+ "metric": {
8
+ "kind": "angle",
9
+ "units": "deg",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 90.0 },
12
+ "limits": { "min": 60.0 },
13
+ "scale_min": 45.0,
14
+ "scale_max": 135.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["trace", "plane"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 0.5
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "aperture_definition_errors",
3
+ "category_id": "fab_process_compatibility",
4
+ "name": "Aperture definition errors",
5
+ "description": "Detect missing, ambiguous, or conflicting aperture definitions in Gerber or artwork data.",
6
+ "what_it_measures": "Count of aperture related errors detected in the image data.",
7
+ "metric": {
8
+ "kind": "count",
9
+ "units": "errors",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 0.0 },
12
+ "limits": { "max": 1.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 10.0
15
+ },
16
+ "severity_default": "error",
17
+ "applies_to": ["other"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 1.0
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "backdrill_stub_length",
3
+ "category_id": "drill_via_integrity",
4
+ "name": "Backdrill stub length",
5
+ "description": "Limit remaining via stubs after backdrilling on high speed nets.",
6
+ "what_it_measures": "Maximum residual stub length on backdrilled vias.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "mm",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 0.3 },
12
+ "limits": { "max": 0.5 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 1.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["via", "net"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 0.6
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "component_to_component_spacing",
3
+ "category_id": "assembly",
4
+ "name": "Component to component spacing",
5
+ "description": "Ensure enough clearance between components for placement, soldering, and rework.",
6
+ "what_it_measures": "Minimum body to body distance between any two components.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "mm",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 0.5 },
12
+ "limits": { "min": 0.25 },
13
+ "scale_min": 0.1,
14
+ "scale_max": 2.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["component"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 1.0
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "copper_density_balance",
3
+ "category_id": "copper_geometry",
4
+ "name": "Copper density balance",
5
+ "description": "Check for large copper density variations that can cause warp, bow, or etch non uniformity.",
6
+ "what_it_measures": "Copper fill percentage in sliding windows across each layer.",
7
+ "metric": {
8
+ "kind": "percent",
9
+ "units": "%",
10
+ "preferred_direction": "target_range",
11
+ "target": { "min": 30.0, "max": 70.0 },
12
+ "limits": { "min": 10.0, "max": 90.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 100.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["plane", "trace"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 1.0
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "copper_sliver_width",
3
+ "category_id": "copper_geometry",
4
+ "name": "Copper sliver width",
5
+ "description": "Detect very thin isolated copper slivers that may peel or over etch.",
6
+ "what_it_measures": "Narrowest width of isolated copper islands or spokes.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "um",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 150.0 },
12
+ "limits": { "min": 100.0 },
13
+ "scale_min": 50.0,
14
+ "scale_max": 250.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["trace", "plane"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 0.7
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "copper_thermal_area",
3
+ "category_id": "thermal_power",
4
+ "name": "Copper thermal area",
5
+ "description": "Ensure heat generating components have enough copper area for dissipation.",
6
+ "what_it_measures": "Total copper area connected to each thermally significant pad or component.",
7
+ "metric": {
8
+ "kind": "area",
9
+ "units": "mm2",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 50.0 },
12
+ "limits": { "min": 20.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 200.0
15
+ },
16
+ "severity_default": "info",
17
+ "applies_to": ["component", "pad_smt", "plane"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 0.5
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "copper_to_edge_distance",
3
+ "category_id": "fabrication_stackup",
4
+ "name": "Copper to edge distance",
5
+ "description": "Verify that copper features are sufficiently pulled back from the board outline.",
6
+ "what_it_measures": "Smallest distance from any copper feature to the final routed board edge.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "um",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 250.0 },
12
+ "limits": { "min": 200.0 },
13
+ "scale_min": 100.0,
14
+ "scale_max": 500.0
15
+ },
16
+ "severity_default": "error",
17
+ "applies_to": ["trace", "plane", "pad_smt", "pad_tht"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 1.0
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "crosstalk_estimate",
3
+ "category_id": "high_speed_si",
4
+ "name": "Crosstalk risk estimate",
5
+ "description": "Estimate near end and far end crosstalk risk based on parallelism and spacing between sensitive nets.",
6
+ "what_it_measures": "Estimated coupling coefficient or risk percentage for critical net pairs.",
7
+ "metric": {
8
+ "kind": "percent",
9
+ "units": "%",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 10.0 },
12
+ "limits": { "max": 25.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 100.0
15
+ },
16
+ "severity_default": "info",
17
+ "applies_to": ["trace", "net"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 0.7
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "dielectric_thickness_uniformity",
3
+ "category_id": "fabrication_stackup",
4
+ "name": "Dielectric thickness uniformity",
5
+ "description": "Check deviation between designed and nominal dielectric thicknesses.",
6
+ "what_it_measures": "Deviation of dielectric thickness from target for each core or prepreg layer.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "um",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 10.0 },
12
+ "limits": { "max": 25.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 50.0
15
+ },
16
+ "severity_default": "info",
17
+ "applies_to": ["stackup"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 0.5
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "diff_pair_skew",
3
+ "category_id": "high_speed_si",
4
+ "name": "Differential pair skew",
5
+ "description": "Limit length mismatch between members of each differential pair.",
6
+ "what_it_measures": "Maximum length difference between traces in each diff pair.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "mm",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 0.5 },
12
+ "limits": { "max": 1.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 2.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["trace", "net"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 1.0
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "diff_pair_spacing",
3
+ "category_id": "high_speed_si",
4
+ "name": "Differential pair spacing",
5
+ "description": "Check that differential pairs maintain their specified intra pair spacing.",
6
+ "what_it_measures": "Deviation of actual gap between paired traces from the nominal design spacing.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "um",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 25.0 },
12
+ "limits": { "max": 50.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 100.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["trace", "net"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 0.8
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "drill_aspect_ratio",
3
+ "category_id": "drill_via_integrity",
4
+ "name": "Drill aspect ratio",
5
+ "description": "Limit the aspect ratio of plated through holes for reliable plating.",
6
+ "what_it_measures": "Maximum board_thickness / drill_diameter across all plated holes.",
7
+ "metric": {
8
+ "kind": "ratio",
9
+ "units": ":1",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 8.0 },
12
+ "limits": { "max": 10.0 },
13
+ "scale_min": 4.0,
14
+ "scale_max": 12.0
15
+ },
16
+ "severity_default": "error",
17
+ "applies_to": ["via", "pad_tht"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 1.0
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "drill_to_drill_spacing",
3
+ "category_id": "drill_via_integrity",
4
+ "name": "Drill to drill spacing",
5
+ "description": "Check minimum spacing between drilled holes to avoid breakout and tool wander issues.",
6
+ "what_it_measures": "Smallest edge to edge distance between any two holes.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "um",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 200.0 },
12
+ "limits": { "min": 150.0 },
13
+ "scale_min": 100.0,
14
+ "scale_max": 400.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["drill", "via", "pad_tht"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 0.8
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "drill_wander_budget",
3
+ "category_id": "yield_prediction",
4
+ "name": "Drill wander budget",
5
+ "description": "Estimate remaining tolerance before drill wander causes breakout or annular ring violations.",
6
+ "what_it_measures": "Minimum additional radial displacement allowed before drill breakout would occur.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "um",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 50.0 },
12
+ "limits": { "min": 25.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 100.0
15
+ },
16
+ "severity_default": "info",
17
+ "applies_to": ["via", "pad_tht", "drill"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 0.9
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "etch_compensation_margin",
3
+ "category_id": "yield_prediction",
4
+ "name": "Etch compensation margin",
5
+ "description": "Estimate margin between copper feature sizes and the minimum etch process capability.",
6
+ "what_it_measures": "Average and worst case margin between actual feature widths or spaces and the process limit values.",
7
+ "metric": {
8
+ "kind": "percent",
9
+ "units": "%",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 20.0 },
12
+ "limits": { "min": 0.0 },
13
+ "scale_min": -20.0,
14
+ "scale_max": 50.0
15
+ },
16
+ "severity_default": "info",
17
+ "applies_to": ["trace", "plane", "pad_smt", "pad_tht"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 1.0
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "fillet_radius_milling",
3
+ "category_id": "mechanical_outline",
4
+ "name": "Internal corner radius for milling",
5
+ "description": "Check that internal corners respect the minimum corner radius dictated by milling tools.",
6
+ "what_it_measures": "Smallest internal corner radius along routed board outlines and cutouts.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "mm",
10
+ "preferred_direction": "maximize",
11
+ "target": { "min": 0.4 },
12
+ "limits": { "min": 0.3 },
13
+ "scale_min": 0.2,
14
+ "scale_max": 1.0
15
+ },
16
+ "severity_default": "info",
17
+ "applies_to": ["board_outline", "mechanical"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "binary",
21
+ "pass_threshold": 100,
22
+ "weight": 0.4
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "highspeed_stub_length",
3
+ "category_id": "high_speed_si",
4
+ "name": "High speed stub length",
5
+ "description": "Check that stubs on high speed nets are short enough to avoid significant reflections.",
6
+ "what_it_measures": "Maximum length of unterminated stubs on nets classified as high speed.",
7
+ "metric": {
8
+ "kind": "distance",
9
+ "units": "mm",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 5.0 },
12
+ "limits": { "max": 10.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 20.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["trace", "net"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 0.9
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "impedance_control",
3
+ "category_id": "fabrication_stackup",
4
+ "name": "Impedance control",
5
+ "description": "Compare realized impedance of controlled impedance traces to their targets.",
6
+ "what_it_measures": "Percentage deviation of calculated trace impedance from specified target impedance.",
7
+ "metric": {
8
+ "kind": "percent",
9
+ "units": "%",
10
+ "preferred_direction": "minimize",
11
+ "target": { "max": 8.0 },
12
+ "limits": { "max": 10.0 },
13
+ "scale_min": 0.0,
14
+ "scale_max": 20.0
15
+ },
16
+ "severity_default": "warning",
17
+ "applies_to": ["trace", "stackup", "net"],
18
+ "scoring": {
19
+ "enabled": true,
20
+ "strategy": "linear",
21
+ "pass_threshold": 80,
22
+ "weight": 1.0
23
+ }
24
+ }