jitxexamples 2.0.0__tar.gz → 2.1.0__tar.gz
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.
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/PKG-INFO +1 -1
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/README.md +5 -1
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js0-setup/JS0_Environment_Setup.md +1 -1
- jitxexamples-2.1.0/jumpstart-kits/js4-si-constraints/JS4_SI-Constraints_Runbook.md +125 -0
- jitxexamples-2.1.0/jumpstart-kits/js4-si-constraints/README.md +113 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/lint.log +1 -1
- jitxexamples-2.1.0/src/jitxexamples/components/connectors/wurth_elektronik_60312202114514.py +142 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_switchmode/texas_instruments_TPS62933DRLR.py +3 -3
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/bga_escape.py +10 -4
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/substrate.py +0 -1
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/js4_si_constraints/__init__.py +14 -0
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/js4_si_constraints/constraint.py +182 -0
- {jitxexamples-2.0.0/src/jitxexamples/jumpstart_kits/js4_fpga_lpddr4x → jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/js4_si_constraints}/main.py +37 -22
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/js4_si_constraints/models.py +138 -0
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/js4_si_constraints/proof.py +150 -0
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x/__init__.py +15 -0
- {jitxexamples-2.0.0/src/jitxexamples/jumpstart_kits/js4_fpga_lpddr4x → jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x}/bundles.py +6 -6
- jitxexamples-2.0.0/src/jitxexamples/jumpstart_kits/js4_fpga_lpddr4x/fpga.py → jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x/circuit.py +16 -17
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x/package_delays.py +156 -0
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x/package_delays_synthetic.csv +169 -0
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x/pinout.py +182 -0
- jitxexamples-2.1.0/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x/proof.py +159 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/board_ground_pours.py +113 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/code_route_basics.py +248 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/fenced_pour_outline.py +276 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/hex_bga_escape.py +502 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_bga_escape.py +271 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_cpwg_two_row_fence.py +444 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_default_rules.py +214 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_diff_pair_escape.py +238 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_edge_and_cutout.py +102 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_heavy_copper_layer.py +381 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_qfn_escape.py +357 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_routing_structure_by_tag.py +123 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_sensitive_net_clearance.py +116 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_stitched_pour.py +258 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/layout_thermal_classes.py +239 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/qfn_thermal_and_power_fanout.py +421 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/rf_connector_launch.py +482 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/serpentine_sections.py +351 -0
- jitxexamples-2.1.0/src/jitxexamples/patterns/wilkinson_tree.py +959 -0
- jitxexamples-2.1.0/test.log +797 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_bga_optimization_demo.py +16 -0
- jitxexamples-2.1.0/tests/test_board_ground_pours.py +190 -0
- jitxexamples-2.1.0/tests/test_code_route_basics.py +299 -0
- jitxexamples-2.1.0/tests/test_fenced_pour_outline.py +454 -0
- jitxexamples-2.1.0/tests/test_hex_bga_escape.py +454 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_js3_mcu_muxing.py +12 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_js3_usb_esd.py +12 -0
- jitxexamples-2.1.0/tests/test_js4_si_constraints.py +302 -0
- jitxexamples-2.1.0/tests/test_layout_bga_escape.py +231 -0
- jitxexamples-2.1.0/tests/test_layout_cpwg_two_row_fence.py +451 -0
- jitxexamples-2.1.0/tests/test_layout_default_rules.py +215 -0
- jitxexamples-2.1.0/tests/test_layout_diff_pair_escape.py +261 -0
- jitxexamples-2.1.0/tests/test_layout_edge_and_cutout.py +103 -0
- jitxexamples-2.1.0/tests/test_layout_heavy_copper_layer.py +337 -0
- jitxexamples-2.1.0/tests/test_layout_qfn_escape.py +233 -0
- jitxexamples-2.1.0/tests/test_layout_routing_structure_by_tag.py +129 -0
- jitxexamples-2.1.0/tests/test_layout_sensitive_net_clearance.py +149 -0
- jitxexamples-2.1.0/tests/test_layout_stitched_pour.py +314 -0
- jitxexamples-2.1.0/tests/test_layout_thermal_classes.py +232 -0
- jitxexamples-2.1.0/tests/test_qfn_thermal_and_power_fanout.py +320 -0
- jitxexamples-2.1.0/tests/test_rf_connector_launch.py +857 -0
- jitxexamples-2.1.0/tests/test_serpentine_sections.py +324 -0
- jitxexamples-2.0.0/tests/test_js4_fpga.py → jitxexamples-2.1.0/tests/test_vp1002_lpddr4x.py +34 -66
- jitxexamples-2.1.0/tests/test_wilkinson_tree.py +1164 -0
- jitxexamples-2.1.0/tests/test_wurth_elektronik_60312202114514.py +96 -0
- jitxexamples-2.0.0/jumpstart-kits/js4-fpga-lpddr4x/README.md +0 -34
- jitxexamples-2.0.0/jumpstart-kits/js4-fpga-lpddr4x/part1-lpddr4x-pins/JS4_Part1_LPDDR4X-Pin-Assignment_Runbook.md +0 -90
- jitxexamples-2.0.0/jumpstart-kits/js4-fpga-lpddr4x/part1-lpddr4x-pins/README.md +0 -86
- jitxexamples-2.0.0/parts.lock.json +0 -413
- jitxexamples-2.0.0/src/jitxexamples/jumpstart_kits/js4_fpga_lpddr4x/__init__.py +0 -13
- jitxexamples-2.0.0/src/jitxexamples/jumpstart_kits/js4_fpga_lpddr4x/constraint.py +0 -64
- jitxexamples-2.0.0/src/jitxexamples/jumpstart_kits/js4_fpga_lpddr4x/pinout.py +0 -506
- jitxexamples-2.0.0/src/jitxexamples/jumpstart_kits/js4_fpga_lpddr4x/proof.py +0 -176
- jitxexamples-2.0.0/src/jitxexamples/patterns/fenced_pour_outline.py +0 -110
- jitxexamples-2.0.0/test.log +0 -541
- jitxexamples-2.0.0/tests/test_fenced_pour_outline.py +0 -174
- jitxexamples-2.0.0/tests/test_js4_pinout.py +0 -453
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/.github/workflows/build.yaml +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/.github/workflows/mirror-main.yml +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/.github/workflows/release.yaml +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/.gitignore +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/CLAUDE.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/build.err +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/build.log +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/docs/Makefile +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/docs/requirements.txt +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/docs/source/conf.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/docs/source/index.rst +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/hooks/pre-commit +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js0-setup/JS0_Reference_Companion.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js0-setup/JS0_Setup_Runbook.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js0-setup/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js1-stackup-components/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js1-stackup-components/part1-stackup/JS1_Part1_Fab-Stackup.csv +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js1-stackup-components/part1-stackup/JS1_Part1_Stackup-from-Fab-CSV_Runbook.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js1-stackup-components/part1-stackup/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js1-stackup-components/part2-versal-fpga/JS1_Part2_Reference_Companion.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js1-stackup-components/part2-versal-fpga/JS1_Part2_Versal-FPGA-from-Pin-File_Runbook.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js1-stackup-components/part2-versal-fpga/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js2-circuits/JS2_Circuits-from-Datasheet_Runbook.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js2-circuits/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js3-pin-assignment/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js3-pin-assignment/part1-mcu-muxing/JS3_Part1_MCU-Peripheral-Muxing_Runbook.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js3-pin-assignment/part1-mcu-muxing/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js3-pin-assignment/part2-usb-esd/JS3_Part2_USB-through-ESD_Runbook.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/js3-pin-assignment/part2-usb-esd/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/shared/JITX_Architecture_and_Systems_Requirements_v2_0.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/shared/README.md +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/shared/images/JITX_Architecture_Fig1_Deployment.png +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/jumpstart-kits/shared/images/JITX_Architecture_FigA1_Workflow.png +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/pyproject.toml +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/audio_amps/PAM8302AADCR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/battery_managers/BQ24078RGTR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/battery_managers/BQ24078RGTR.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/battery_managers/PH2_0_2PWB.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/bjts/BJT_2N3904S_RTKPS.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/buttons/PTS810SJM250SMTRLFS.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/buttons/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/buttons/xunpu_TS_1088_AR02016.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/buttons/xunpu_TS_1088_AR02016.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/bel_fuse_0826_1G1T_23_F.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/hirose_electric_co_ltd_U_FL_R_SMT_10.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/molex_2012670005.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/myoung_MY_1632_03.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/pulse_electronics_JD0_0001NL.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/q_j_CR2032_BS_6_1.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/q_j_CR2032_BS_6_1.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/connectors/weidmuller_LSF_SMT.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/crystals/HC_49SM12MHz20pF30ppm.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/crystals/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/crystals/seiko_epson_TSX_3225.csv +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/crystals/seiko_epson_TSX_3225.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/crystals/yangxing_tech_X322512MSB4SI.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/crystals/yangxing_tech_X322512MSB4SI.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/digital_isolators/PUSB3FR4.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/diodes_tvs/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/diodes_tvs/littelfuse_SMBJ43CA.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/diodes_tvs/littelfuse_SMBJ43CA.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/ethernet_phys/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/ethernet_phys/microchip_KSZ9031RNX.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/fets_n_ch/BSN20.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/fets_n_ch/BSS138.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/fets_n_ch/BSS138.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/fets_p_ch/AO3401A.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/fets_p_ch/AO6409.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/fets_p_ch/AO6409.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/fets_p_ch/NTF6P02T3G.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/flash/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/flash/winbond_W25Q128JVSIQ.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/flash/winbond_W25Q128JVSIQ.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/isolators/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/isolators/texas_instruments_ISO1211.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/led_drivers/IS31FL3236A_QFLS2_TR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/KT_0603G.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/KT_0603G.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/KT_0603R.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/KT_0603W.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/KT_0603W.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/KT_0603Y.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/WS2816C_2121.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/foshan_nationstar_optoelectronics_FM_B2020RGBA_HG.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/togialed_TJ_S3210SW5TGLC2R_A5.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/leds/togialed_TJ_S3210SW5TGLC2R_A5.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/level_translators/logic_level_shifter.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/logic/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/logic/texas_instruments_SN74HC14PWR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/logic/texas_instruments_SN74HC14PWR.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/mcus/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/mcus/nordic_NRF52840_QIAA_R.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/mcus/raspberry_pi_RP2040.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/memories/MT40A1G16TB_062E_F.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/memories/MT53E1G32D2FW_046_WT_B.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/memories/W25Q128JVSIQTR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/microphones/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/microphones/allpower_AP3722AT.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/opamps/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/opamps/stmicroelectronics_TS971ILT.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/opamps/texas_instruments_OPA189.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/opamps/texas_instruments_TLV314IDBVR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/opamps/texas_instruments_TLV314IDBVR.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/passives/RK09K1130AP5.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_linear_regulators/AP2125K_2_8TRG1.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_linear_regulators/NCP1117LPST33T3G.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_linear_regulators/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_linear_regulators/analog_devices_LT1763CS8.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_linear_regulators/analog_devices_LT1763CS8.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_linear_regulators/texas_instruments_LM1117LD.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_switches/high_side_switch.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/power_switchmode/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/sensors/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/sensors/stmicroelectronics_LIS3DHTR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/sensors_distance/VL53L0CXV0DH_1.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/switches/MK_12C02_G025.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/timers/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/timers/texas_instruments_NE555.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/transceivers/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/transceivers/texas_instruments_SN65HVD1781DR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/transceivers/texas_instruments_SN65HVD1781DR.stp +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/transistors/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/transistors/changjiang_electronics_tech_BSS138.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/components/transistors/on_semiconductor_NTA4151PT1G.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/constraints.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/deskew.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/generic_bga.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/si_geometry.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup/board.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup/main.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/bundles.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/circuit.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/landpattern.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/main.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/symbols.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/tools/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/tools/generate_pinout.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/xcvp1002.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js2_circuits/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js2_circuits/main.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js2_circuits/phy.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js2_circuits/straps.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/mcu_muxing/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/mcu_muxing/main.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/mcu_muxing/verify.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/usb_esd/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/usb_esd/esd.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/usb_esd/main.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/jumpstart_kits/js3_pin_assignment/usb_esd/verify.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/parts/example-passives.csv +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/pin_lane_polarity.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/pin_series_array.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_bundle_skew.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_daisy_chain.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_diff_pair.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_parts.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_point_to_point.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_series_part.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_signal_constraint.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_via_model.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/patterns/si_via_structure.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/protocols/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/protocols/memory/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/protocols/memory/ddr4.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/protocols/memory/ddr4_example.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/protocols/memory/lpddr4.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/protocols/memory/lpddr4_example.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/substrates/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/substrates/generic_20layer.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/test.err +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/__init__.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/conftest.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/parts.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_AO3401A.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_AO6409.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_AP2125K_2_8TRG1.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_BJT_2N3904S_RTKPS.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_BQ24078RGTR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_BSN20.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_BSS138.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_HC_49SM12MHz20pF30ppm.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_IS31FL3236A_QFLS2_TR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_KT_0603G.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_KT_0603R.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_KT_0603W.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_KT_0603Y.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_MK_12C02_G025.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_MT40A1G16TB_062E_F.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_MT53E1G32D2FW_046_WT_B.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_NCP1117LPST33T3G.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_NTF6P02T3G.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_PAM8302AADCR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_PH2_0_2PWB.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_PTS810SJM250SMTRLFS.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_PUSB3FR4.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_RK09K1130AP5.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_VL53L0CXV0DH_1.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_W25Q128JVSIQTR.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_WS2816C_2121.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_allpower_ap3722at.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_analog_devices_lt1763cs8.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_bel_fuse_0826_1g1t_23_f.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_changjiang_electronics_tech_bss138.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_docstring_rst.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_example_passives_packaged.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_foshan_nationstar_optoelectronics_fm_b2020rgba_hg.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_high_side_switch.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_hirose_electric_co_ltd_u_fl_r_smt_10.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_iso1211.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_jd0_0001nl.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_js1_hdi_stackup.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_js1_versal_fpga.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_js2_circuits.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_littelfuse_smbj43ca.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_lm1117ld.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_logic_level_shifter.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_lsf_smt.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_microchip_ksz9031rnx.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_molex_2012670005.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_myoung_my_1632_03.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_ne555.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_nordic_nrf52840_qiaa_r.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_on_semiconductor_nta4151pt1g.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_opa189.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_parts_chain.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_pin_lane_polarity.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_pin_series_array.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_protocols_ddr4.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_protocols_lpddr4.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_q_j_cr2032_bs_6_1.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_rp2040.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_seiko_epson_tsx_3225.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_bundle_skew.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_daisy_chain.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_diff_pair.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_point_to_point.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_series_part.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_signal_constraint.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_via_model.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_si_via_structure.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_sn65hvd1781dr.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_stmicroelectronics_lis3dhtr.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_stmicroelectronics_ts971ilt.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_texas_instruments_sn74hc14pwr.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_texas_instruments_tlv314idbvr.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_togialed_tj_s3210sw5tglc2r_a5.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_tps62933drlr.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_w25q128.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_xunpu_ts_1088_ar02016.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/tests/test_yangxing_tech_x322512msb4si.py +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/typecheck.err +0 -0
- {jitxexamples-2.0.0 → jitxexamples-2.1.0}/typecheck.log +0 -0
|
@@ -69,10 +69,14 @@ at the repo root (published to the docs site), not here.
|
|
|
69
69
|
Substrates define reusable PCB construction details. `generic_20layer.py` provides `Generic_Substrate`, a generic 20-layer stackup with dielectric/conductor materials, fabrication constraints, and via classes that designs can use directly or specialize.
|
|
70
70
|
|
|
71
71
|
### Pattern definitions (`src/jitxexamples/patterns/`)
|
|
72
|
-
Patterns are small modules that each show one technique, written to be read; each ends in a design that translates with `jitx design build --dry`. `fenced_pour_outline.py` fences an arbitrary closed outline (an antipad, an RF cavity, a BGA breakout) with vias: a `Tag`, a `design_constraint(...).fence_via(...)` rule on the substrate, and a tagged `Pour` inside a `FencedOutline` circuit whose `GND` port connects to the board's ground net. A `KeepOut` over the same outline, which keeps pours and auto-placed vias out of the opening, is optional; the module adds one. Its design target is `jitxexamples.patterns.fenced_pour_outline.fenced_pour_outline_design`. To see the fence, run a full build (`jitx design build <target>`, which needs the runtime) and open the board with `jitx ui open --board --design <target>`.
|
|
72
|
+
Patterns are small modules that each show one technique, written to be read; each ends in a design that translates with `jitx design build --dry`. `fenced_pour_outline.py` fences an arbitrary closed outline (an antipad, an RF cavity, a BGA breakout) with vias: a `Tag`, a `design_constraint(...).fence_via(...)` rule on the substrate, and a tagged `Pour` inside a `FencedOutline` circuit whose `GND` port connects to the board's ground net. A `KeepOut` over the same outline, which keeps pours and auto-placed vias out of the opening, is optional; the module adds one. Its design target is `jitxexamples.patterns.fenced_pour_outline.fenced_pour_outline_design`. To see the fence, run a full build (`jitx design build <target>`, which needs the runtime) and open the board with `jitx ui open --board --design <target>`. The module also has `CavityRing`, a closed ring turned inwards (a negative `offset`) so its vias land in a ground cavity pour's own copper, with a same-net anchor via; its target is `jitxexamples.patterns.fenced_pour_outline.cavity_ring_design`. `fence_count_range` gives the via counts to accept along an outline before a build is checked.
|
|
73
|
+
|
|
74
|
+
The `layout_*` modules each show one design-rule technique on jitx 4.6. Each has offline tests and a runtime test, gated by `JITX_PATTERN_RUNTIME=1`, that measures the computed copper. Pours and vias: `layout_default_rules` (board defaults for trace width, clearance and pad relief, checked against the fab floors, with rules on power and ground net tags at a higher priority), `layout_thermal_classes` (relief per pad class chosen from the measured pad size, plus a direct connect on an exposed pad and an untagged part that joins its pour solidly because no relief rule matches it), `layout_heavy_copper_layer` (floors for one heavy inner layer with `OnLayer` on the priority ladder, with `heavy_layer_index` to find the layer and `heavy_layer_rules` to write the floors and the copies of the net-tag rules), `layout_stitched_pour` (a `stitch_via` rule on a pour tag, its pitch checked against the via and the fab, and `expected_stitch_sites` for the sites a build must fill) and `layout_edge_and_cutout` (pour pullback from the board edge with `IsBoardEdge`, and from cutouts, outline holes and via drills with `IsHole`). Routing: `layout_cpwg_two_row_fence` (a grounded coplanar line with two rows of fence vias, fenced through its routing structure, with functions for the coplanar gap, the row positions and counts, and the rows that reach the pour), `layout_qfn_escape` (a power trace stepped down to fit a QFN pad, with `escape_width` deriving the width from the pad, the nearest other pad and a chosen escape clearance), `layout_bga_escape` (a power trace stepped down to pass between BGA balls, with the width read from the balls), `layout_diff_pair_escape` (two differential pairs necked down at a fine-pitch device and held apart in the run, by tags on the routes), `layout_sensitive_net_clearance` (a clearance between the tags on an RF net and a switch-node net: the switch-node pour pulls back from the RF line while a GND pour stays at its default clearance) and `layout_routing_structure_by_tag` (routing structures applied by tag, with a neck structure on the escape).
|
|
73
75
|
|
|
74
76
|
The `si_*` modules each show one signal-integrity constraint on jitx 4.6, on plain nets with code routes that close the path, and their docstrings paste the design-issues output they produced: `si_point_to_point` (timing and loss with a `TerminatingPinModel`), `si_series_part` (a `BridgingPinModel` through a series part), `si_via_model` (a via with `models`), `si_diff_pair` (intra-pair skew), `si_bundle_skew` (skew across pairs with `ConstrainReferenceDifference`), `si_daisy_chain` (an ordered chain with `>>`), `si_via_structure` (a via structure from `jitxlib.via_structures`) and `si_signal_constraint` (a `SignalConstraint` subclass); `si_parts` holds their fictional parts. The `pin_*` modules show SI constraints on pin-assigned paths: `pin_lane_polarity` (lane choice and P/N inversion on a provider that is one end of the path) and `pin_series_array` (channel choice through a pass-through part, both sides in one mapping). The `jitx-interconnect-constraints` and `jitx-pin-assignment` skills point at them as worked patterns.
|
|
75
77
|
|
|
78
|
+
The code-layout modules each build a piece of physical layout in code: `code_route_basics` (code routes on one layer: a plain route, a `Route.Sketch` detour past a via column, and `Route.Config` overrides for trace width, trace space and a destination target, one of which tapers the trace into its pad), `serpentine_sections` (length-matched sections on four differential pairs, each a chain of code routes through `PairInsertion` and `PairPoint` control points whose section between the two `PairPoint`s may meander, each pair under its own serpentine or deskew rule), `wilkinson_tree` (a fenced 1:4 Wilkinson divider tree built from one 1:2 cell, with code routes from an input connector to four outputs and a timing constraint that matches the four paths; each line leaves its pad straight to a `RoutePoint`, and each that turns bends around a tagged ground copper square, and each divider body is fenced like a trace by a fence pour equal to its copper), `rf_connector_launch` (an SMA end launch into a fenced grounded coplanar line: a straight exit to a `RoutePoint` on the pad's axis, a small tagged ground copper square past it whose clearance rule to the line sets the bend radius, and a hyperbolic cutout in the ground under the centre pad), `hex_bga_escape` (two differential pairs out of a hex-grid BGA, split at a `PairPoint` at the ball field's edge so a tagged neck structure runs through the field and the full structure outside it), `qfn_thermal_and_power_fanout` (a grid of thermal vias in the RP2040's exposed pad with a matching soldermask and paste opening, and its `IOVDD` pins fanned out through escapes, trunks and vias to a 3.3 V plane) and `board_ground_pours` (a `GND` pour on every copper layer, all held by one through `GND` anchor via and pulled back from the board edge by an `IsBoardEdge` rule). Each has offline tests and a runtime test, gated by `JITX_PATTERN_RUNTIME=1`, that builds the design and measures the realized copper; run the runtime tests with a JITX runtime started at the repository root.
|
|
79
|
+
|
|
76
80
|
### Protocol definitions (`src/jitxexamples/protocols/`)
|
|
77
81
|
High-speed protocols that `jitxlib.protocols` does not ship: port bundles plus a `SignalConstraint` whose skew limits cite their source and its scope in the module docstring. Each protocol module has a worked example beside it named `<protocol>_example.py`, a `SampleDesign` that nets a fictional controller to a real memory part and applies the constraint without `>>`. Today that is `memory/lpddr4.py` (Micron MT53E1G32D2FW-046 WT:B, an LPDDR4X/LPDDR4 part, target `jitxexamples.protocols.memory.lpddr4_example.LPDDR4ExampleDesign`) and `memory/ddr4.py` (Micron MT40A1G16TB-062E:F, target `jitxexamples.protocols.memory.ddr4_example.DDR4ExampleDesign`). The examples are not routed, so the design issues (each example's docstring shows the `issues(satisfied=True)` call) list each constrained path as `Unconnected Topology` until the board is routed.
|
|
78
82
|
|
|
@@ -177,7 +177,7 @@ Devin session (or ask it to reload/list skills) and verify with:
|
|
|
177
177
|
```text
|
|
178
178
|
List the available skills related to JITX. Confirm whether you can see @jitx,
|
|
179
179
|
@jitx-component-modeler, @jitx-circuit-builder, @jitx-substrate-modeler,
|
|
180
|
-
@jitx-
|
|
180
|
+
@jitx-code-layout, @jitx-interconnect-constraints, @jitx-pin-assignment,
|
|
181
181
|
@jitx-code-review, and @jitx-mechanical.
|
|
182
182
|
```
|
|
183
183
|
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
JITX SI Constraints Runbook (JS4) · rev 3.0 · 2026-11-03
|
|
3
|
+
Give this file to your AI coding agent (Claude Code, Codex / GPT, or Devin) and tell it to follow
|
|
4
|
+
the file. Complete JS0 and JS1 Part 1 first, then START A NEW AGENT SESSION: a skills install only
|
|
5
|
+
takes effect in a session started after it.
|
|
6
|
+
-->
|
|
7
|
+
|
|
8
|
+
# JITX SI Constraints Runbook (JS4)
|
|
9
|
+
|
|
10
|
+
Each step below is a request, written the way you would ask an agent for the work. Follow them in
|
|
11
|
+
order; at a **[HUMAN]** step, stop and wait for me. Drive `jitx-interconnect-constraints` for the
|
|
12
|
+
constraints and the base `jitx` skill for the project. The ground truth is AMD UG863, *Versal
|
|
13
|
+
Adaptive SoC PCB Design User Guide*, its LPDDR4/4x timing constraint rules and physical design
|
|
14
|
+
rules: <https://docs.amd.com/r/en-US/ug863-versal-pcb-design>. Cite its revision wherever you use
|
|
15
|
+
it. If you cannot read those tables, tell me what you tried and ask me for them. Where it leaves a
|
|
16
|
+
choice, make it and tell me what you chose. Don't open
|
|
17
|
+
`jitxexamples.jumpstart_kits.js4_si_constraints`, even where a skill offers it as an example: it is
|
|
18
|
+
a finished answer to this task.
|
|
19
|
+
|
|
20
|
+
**Prerequisites:** JS0 and JS1 Part 1 are done, and you have the `board.py` JS1 Part 1 produced;
|
|
21
|
+
Python 3.12+; you can fetch from amd.com.
|
|
22
|
+
|
|
23
|
+
Every part comes from the `jitxexamples` package; model none, and leave the FPGA's pin offer as it
|
|
24
|
+
is:
|
|
25
|
+
|
|
26
|
+
- `jumpstart_kits.vp1002_lpddr4x`: `circuit.VP1002LPDDR4X`, the JS1 VP1002 offering one x32
|
|
27
|
+
LPDDR4X interface, `bundles.VersalLPDDR4X`, with the pin swaps AMD allows, and
|
|
28
|
+
`pinout.LPDDR4X_X32`, the pins it offers. JITX picks the pins when the board is routed.
|
|
29
|
+
- `components.memories.MT53E1G32D2FW_046_WT_B.MT53E1G32D2FW_046_WT_B`, the Micron memory.
|
|
30
|
+
- `protocols.memory.lpddr4`: the `LPDDR4` bundles and `LPDDR4Constraint`, a reusable constraint
|
|
31
|
+
whose `LPDDR4ConstraintParams` defaults come from a different guide, UG583.
|
|
32
|
+
- `jumpstart_kits.vp1002_lpddr4x.package_delays.SYNTHETIC_CSV`, the path of the FPGA's package delay
|
|
33
|
+
file, with columns named after Vivado's I/O ports export (UG899 Appendix A): one row per pin of
|
|
34
|
+
memory triplet M0, with its minimum and maximum delay in ps, both legs of a P/N pair alike. Its
|
|
35
|
+
values are synthetic estimates, not AMD data; say so wherever you report a delay that includes
|
|
36
|
+
them. Its `Pin Number` is the ball: map it to an FPGA port with `ball_to_rc` from
|
|
37
|
+
`jumpstart_kits.js1_stackup_components.versal_fpga.tools.generate_pinout` and the FPGA's
|
|
38
|
+
`ball_assignments()`, and check one: ball AT20 is `IO_L8P_N2P4_M0P70_701`.
|
|
39
|
+
|
|
40
|
+
## Steps
|
|
41
|
+
|
|
42
|
+
**0 · Preflight.**
|
|
43
|
+
Tell me this runbook's revision, from the comment at the top, and confirm
|
|
44
|
+
`jitx-interconnect-constraints` is invocable.
|
|
45
|
+
|
|
46
|
+
**1 · Project.**
|
|
47
|
+
Set up a new JITX project for this board in an empty directory, with `jitxexamples` as a dependency
|
|
48
|
+
and my JS1 Part 1 `board.py` copied in, and build the seeded design.
|
|
49
|
+
|
|
50
|
+
**2 · Connect.**
|
|
51
|
+
Place the VP1002 and the Micron on my JS1 board and substrate, require the FPGA's interface and net
|
|
52
|
+
it to the memory with plain nets, each channel's one CKE to both of the memory's CKE balls. Build
|
|
53
|
+
it.
|
|
54
|
+
|
|
55
|
+
**3 · [HUMAN] Constraint plan.**
|
|
56
|
+
First tell me, in a few sentences, what a JITX timing constraint measures along a path and where
|
|
57
|
+
each part of that measurement comes from. Then show me every UG863 LPDDR4/4x timing and physical
|
|
58
|
+
rule in a table: its value, and how you will express it in JITX or why you won't. Turn the 3600 mil
|
|
59
|
+
trace length rule into a delay from the substrate's own velocity: about 525 ps on the JS1
|
|
60
|
+
striplines. Name the routing structures against UG863's impedance targets, and the closest with the
|
|
61
|
+
gap if none is in range. Say how you will count package delay and via delay, quoting what UG863 says
|
|
62
|
+
about package delay. A `TerminatingPinModel` adds its pin's package delay to every path on that pin,
|
|
63
|
+
delay limits included, so with the pin models step 4 asks for, package delay counts toward the 3600
|
|
64
|
+
mil limit: say so, and what that leaves for the trace with the file's delays. Flag where the FPGA's
|
|
65
|
+
offer differs from the table. Wait for my approval.
|
|
66
|
+
|
|
67
|
+
**4 · Constraints.**
|
|
68
|
+
Write the approved rules as one reusable constraint for this link that takes the routing structures
|
|
69
|
+
and the limits as arguments and builds on `LPDDR4Constraint`, and apply it. Give each FPGA pin in
|
|
70
|
+
the package delay file a `TerminatingPinModel` at the midpoint of its minimum and maximum, reading
|
|
71
|
+
the file by column name and skipping rows with no delay, as a full export lists every pin; leave
|
|
72
|
+
the memory's pins without one.
|
|
73
|
+
Build, and check the issues.
|
|
74
|
+
Expect 66 skews (per channel the CK pair, two CKE, two CS and six CA; per byte the DQS pair, DQS
|
|
75
|
+
to CK, DMI and eight DQ) and 56 delay limits. Unrouted, each sits in its own `Unassigned Pin on
|
|
76
|
+
Path` group, except that each CKE ball's skew and delay share one group reporting that ball's path
|
|
77
|
+
unrouted (`No path for signal constraint`, or a `Signal path` line ending `is not routed yet`): 118
|
|
78
|
+
`NOT MET` groups, then `met Satisfied`, the routing check. Map any other count to these. On jitx
|
|
79
|
+
4.6.0 the report may name a path's FPGA end through a net on the required bundle, as in
|
|
80
|
+
`RESET_n.ch[0].ca[0]`; the path is still that signal's.
|
|
81
|
+
|
|
82
|
+
**5 · Verify.**
|
|
83
|
+
Give the JS1 microvias you will route through a delay model, on subclasses in this project, not in
|
|
84
|
+
`board.py`: the time across the via's dielectric from the middle of its top copper to the middle of
|
|
85
|
+
its bottom copper, D·√Dk / c, from the substrate's own thicknesses and Dk, with no loss. Then write
|
|
86
|
+
a verification design that code-routes one channel B byte lane, its CK pair, its CKE (FPGA pin to
|
|
87
|
+
one CKE ball, on to the other) and one CA bit, on the inner striplines through those microvias in
|
|
88
|
+
the pads. Expect 15 Skew and 12 Time lines and no `Using placeholder model` line; report each
|
|
89
|
+
against its limit, how much of each Time and each Skew is package delay, and what UG863's layout
|
|
90
|
+
rules would flag. Don't match lengths.
|
|
91
|
+
|
|
92
|
+
Then run the skills' checks and `jitx-code-review`, fix what they find apart from unrouted paths,
|
|
93
|
+
and report each result.
|
|
94
|
+
|
|
95
|
+
**6 · [HUMAN] Change a requirement.**
|
|
96
|
+
Invite me to change a requirement, suggesting: *"Our SI team wants DQ and DMI within ±50 ps of DQS.
|
|
97
|
+
Change that limit and show me where the routed paths stand."* Change only that limit, in one place,
|
|
98
|
+
rebuild the verification design, and show me the new limit as the report prints it and each routed
|
|
99
|
+
DQ and DMI skew against it, from the new report: the router may lay the routes differently. Then
|
|
100
|
+
run step 5's checks again.
|
|
101
|
+
|
|
102
|
+
## Done when
|
|
103
|
+
|
|
104
|
+
- The design binds my JS1 substrate, uses `VP1002LPDDR4X`'s pin offer unchanged, and nets the
|
|
105
|
+
interface to the memory with plain nets, one CKE per channel to both CKE balls.
|
|
106
|
+
- The step 3 table covers every UG863 LPDDR4/4x timing and physical rule with its revision, each
|
|
107
|
+
applied or left out with a reason; the 3600 mil rule is a delay derived from the substrate's
|
|
108
|
+
velocity; the impedance gap is reported, with no width invented. Step 3 stopped before any
|
|
109
|
+
constraint was written.
|
|
110
|
+
- The constraint is one reusable class or function that takes the structures and limits as
|
|
111
|
+
arguments, and the shipping design reports its 66 skews and 56 delay limits, unmeasured, in 118
|
|
112
|
+
`NOT MET` groups.
|
|
113
|
+
- Each FPGA pin in the package delay file carries a `TerminatingPinModel` at the midpoint of its
|
|
114
|
+
minimum and maximum, read from the file by column name; the memory's pins carry none. Every report
|
|
115
|
+
of a delay that includes them says the values are synthetic.
|
|
116
|
+
- The microvias the verification design routes through carry a delay model from the substrate's
|
|
117
|
+
thicknesses and Dk, and `board.py` is unchanged.
|
|
118
|
+
- The verification design reports 15 Skew lines and 12 Time lines and no placeholder model, each set
|
|
119
|
+
against its limit.
|
|
120
|
+
- `pyright` passes with zero suppressions; `pytest` passes for any tests you wrote; `jitx design
|
|
121
|
+
find` shows no import failures; every design builds; and `jitx-code-review` leaves no CRITICAL
|
|
122
|
+
finding (every result reported, with the reason for each WARNING kept), after step 5 and again
|
|
123
|
+
after step 6.
|
|
124
|
+
- After step 6 exactly one limit has changed, and the verification design reports each DQ and DMI
|
|
125
|
+
skew against ±50 ps.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# JS4: SI Constraints
|
|
2
|
+
|
|
3
|
+
**Shortcut:** {download}`Download the runbook <JS4_SI-Constraints_Runbook.md>`, give it to your AI
|
|
4
|
+
coding agent, and tell it to follow the file.
|
|
5
|
+
|
|
6
|
+
Turn a vendor's layout guide into signal-integrity constraints by prompting an agent that drives
|
|
7
|
+
`jitx-interconnect-constraints`. The agent reads AMD UG863's LPDDR4/4x rules for the link from the
|
|
8
|
+
JS1 VP1002 FPGA to a Micron MT53E1G32D2FW LPDDR4X memory and writes the timing rules and the trace
|
|
9
|
+
length rule as one reusable constraint: skew limits, the length rule turned into a delay limit
|
|
10
|
+
through the stackup's own velocity, routing structures and reference planes. It gives the FPGA's
|
|
11
|
+
pins package delays from a supplied file of synthetic estimates (not AMD data) and the board's
|
|
12
|
+
microvias a delay model, then code-routes one byte lane, a clock, the clock enable and an address
|
|
13
|
+
bit, and JITX measures each routed path against its limits.
|
|
14
|
+
|
|
15
|
+
## What you learn
|
|
16
|
+
|
|
17
|
+
A timing constraint in JITX is a limit on a path, written in code. It names the path from one pin
|
|
18
|
+
to another through the nets, and a limit on that path's delay or on the difference between two
|
|
19
|
+
paths' delays. JITX adds up everything on the path: the package delay inside each end pin, given as
|
|
20
|
+
a pin model; each trace, from its routing structure's velocity on the layer it runs on; each via,
|
|
21
|
+
from its delay model; and any part the path passes through, from that part's pin model. The issue
|
|
22
|
+
report sets each routed path's sum against its limit.
|
|
23
|
+
|
|
24
|
+
Because the constraint is code, its limits are arguments. In this kit the agent writes UG863's rules
|
|
25
|
+
once, as one constraint for this link. A tighter requirement from your SI team is one changed value
|
|
26
|
+
and a rebuild (gate 2 below). A revision of UG863 that changes only limits changes numbers, not
|
|
27
|
+
code. The next board with this link, or another stackup, takes the same constraint with its own
|
|
28
|
+
routing structures. The package delays come from a file, so a new export changes an input, not the
|
|
29
|
+
constraint; the via models are code on the stackup's own materials, so a new stackup needs its own.
|
|
30
|
+
The interface is the example; what you learn is how to capture a guide's timing rules once and carry
|
|
31
|
+
them from board to board.
|
|
32
|
+
|
|
33
|
+
## What the kit supplies and leaves out
|
|
34
|
+
|
|
35
|
+
UG863 says "Include adaptive SoC package delays for all skew calculations", and "Include package
|
|
36
|
+
delay in routing constraints when determining signal trace lengths unless otherwise specified". It
|
|
37
|
+
takes the delays from Vivado's per-pin export, at the midpoint of each pin's minimum and maximum.
|
|
38
|
+
AMD publishes them only through Vivado, and the VP1002's were not available for this kit, so the
|
|
39
|
+
kit supplies a package delay file with the export's column names whose values are synthetic
|
|
40
|
+
estimates, not AMD data; both legs of each differential pair get the same value. The agent turns it
|
|
41
|
+
into the pin models.
|
|
42
|
+
|
|
43
|
+
A pin model adds its delay to every path on that pin, the delay limit included, so this kit counts
|
|
44
|
+
package delay toward the 3600 mil rule, which UG863's table calls a PCB trace length. That is the
|
|
45
|
+
conservative reading: it leaves the trace about 2280 to 2940 mil on the length-limited pins with
|
|
46
|
+
these estimates. The other reading holds the trace alone to 3600 mil, and needs each path's limit
|
|
47
|
+
raised by its own pin's package delay, which is not known until JITX assigns the pins. The agent
|
|
48
|
+
shows you the reading it applies, and what it leaves for the trace, at gate 1. On your own board,
|
|
49
|
+
export the real delays from Vivado, check their column names, and point the same code at that file.
|
|
50
|
+
|
|
51
|
+
The via delay model is first order: the time to cross the dielectric from the middle of one copper
|
|
52
|
+
layer to the middle of the next, from the stackup's own thicknesses and Dk. It leaves out the pad
|
|
53
|
+
and antipad, so it is a floor on each via's delay, not a characterization. The agent puts it on
|
|
54
|
+
JS4's own copies of the JS1 microvias; your JS1 `board.py` stays as it is.
|
|
55
|
+
|
|
56
|
+
Some of UG863 stays outside the constraint. Spacing, via counts and which layer a group runs on are
|
|
57
|
+
layout rules for a layout review. JS4 does not match lengths: the verification routes stay as
|
|
58
|
+
routed, so some miss their limits, and a skew between two different FPGA pins includes their
|
|
59
|
+
package delays' difference, synthetic here. A miss shows the check working, not a fault for the
|
|
60
|
+
agent to fix.
|
|
61
|
+
|
|
62
|
+
The FPGA comes from the `jitxexamples` package with its LPDDR4X pin swaps already offered, so JITX
|
|
63
|
+
picks its pins when the board is routed; [JS3](../js3-pin-assignment/) teaches that part. JS4
|
|
64
|
+
exports no XDC, and validating the FPGA pins in Vivado stays your step.
|
|
65
|
+
|
|
66
|
+
## Before you start
|
|
67
|
+
|
|
68
|
+
- Finish [JS0](../js0-setup/) and [JS1 Part 1](../js1-stackup-components/part1-stackup/). The
|
|
69
|
+
design uses the substrate you built there.
|
|
70
|
+
- Start a new agent session. A skills install only takes effect in a session started after it.
|
|
71
|
+
- Allow about two hours of agent time, plus the time you spend at the two decisions below.
|
|
72
|
+
- Have your JS1 Part 1 `board.py` at hand. Your agent needs network access to amd.com.
|
|
73
|
+
- To compare this run with your current flow afterward, note now roughly how long it takes your
|
|
74
|
+
team to get a memory interface's layout-guide rules into the layout tool's constraints, and how
|
|
75
|
+
long a changed limit takes to reach the constraints and the check
|
|
76
|
+
against the routed board. During the run, time it, and time gate 2 from your request to the
|
|
77
|
+
agent's report.
|
|
78
|
+
|
|
79
|
+
## What the agent asks of you
|
|
80
|
+
|
|
81
|
+
Two `[HUMAN]` gates stop for you:
|
|
82
|
+
|
|
83
|
+
1. **Approve the constraint plan.** The agent shows you every UG863 LPDDR4/4x rule beside how it
|
|
84
|
+
will express it in JITX, or why it won't, with the routing structures it will use, the gap to
|
|
85
|
+
UG863's impedance targets, how it will model package and via delay, and the one clock enable per
|
|
86
|
+
channel the FPGA offers where UG863 lists two for a dual-rank memory. You approve before it
|
|
87
|
+
writes any constraint.
|
|
88
|
+
2. **Change a requirement.** Ask for a tighter limit (the runbook suggests DQ and DMI within ±50 ps
|
|
89
|
+
of DQS). The agent changes that one value, rebuilds, and shows you the new limit in the report
|
|
90
|
+
and each routed DQ and DMI path's verdict against it.
|
|
91
|
+
|
|
92
|
+
## After the run
|
|
93
|
+
|
|
94
|
+
You can now write a layout guide's timing and length rules as constraints that JITX measures on the
|
|
95
|
+
routed board, with the package and via delays on the path. Set gate 2's time against the same change
|
|
96
|
+
in your current flow, through to the check against the routed board; that comparison counts for more
|
|
97
|
+
than the whole run's time against your note, since a first run includes learning. Length matching,
|
|
98
|
+
the step toward meeting these limits, is outside this kit. Then write the constraints for an
|
|
99
|
+
interface from one of your own boards, from its vendor's layout guide and your own package delay
|
|
100
|
+
export, and time it against the same note: that second run is the fairer measure.
|
|
101
|
+
|
|
102
|
+
## Files
|
|
103
|
+
|
|
104
|
+
- [The runbook](JS4_SI-Constraints_Runbook.md), to read here;
|
|
105
|
+
{download}`download it <JS4_SI-Constraints_Runbook.md>` to give to your agent. It names the AMD
|
|
106
|
+
guide the agent fetches.
|
|
107
|
+
- The synthetic package delay file, `package_delays_synthetic.csv`, ships inside the `jitxexamples`
|
|
108
|
+
package next to
|
|
109
|
+
[`jumpstart_kits.vp1002_lpddr4x.package_delays`](https://github.com/JITx-Inc/jitx-examples/tree/main/src/jitxexamples/jumpstart_kits/vp1002_lpddr4x),
|
|
110
|
+
which generates it and says how.
|
|
111
|
+
- The reference solution, module
|
|
112
|
+
[`jitxexamples.jumpstart_kits.js4_si_constraints`](https://github.com/JITx-Inc/jitx-examples/tree/main/src/jitxexamples/jumpstart_kits/js4_si_constraints)
|
|
113
|
+
in the `jitxexamples` package (`pip install jitxexamples`).
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""
|
|
2
|
+
60312202114514 / WR-SMA end launch jack
|
|
3
|
+
=======================================
|
|
4
|
+
|
|
5
|
+
This module provides a component definition for the Würth Elektronik
|
|
6
|
+
60312202114514, a WR-SMA 50 ohm end launch jack with a flat centre tab, for a
|
|
7
|
+
1.6 mm board.
|
|
8
|
+
|
|
9
|
+
The land pattern comes from the recommended land pattern of the Würth
|
|
10
|
+
datasheet drawing, revision 001.001. All dimensions are in mm:
|
|
11
|
+
|
|
12
|
+
- centre pad 0.61 +/-0.05 wide and at least 1.97 long, from the board end;
|
|
13
|
+
- ground pads 9.9 +/-0.05 outer and 7.1 +/-0.05 inner overall width, 5.0
|
|
14
|
+
+/-0.05 long, on the top and on the bottom of the board.
|
|
15
|
+
|
|
16
|
+
The land pattern has no ground vias. The drawing gives the part as 50 ohm from
|
|
17
|
+
DC to 18 GHz, with VSWR 1.2 and insertion loss 0.14 dB at most up to
|
|
18
|
+
12.4 GHz, and notes that "The VSWR in application varies decisively according
|
|
19
|
+
to PCB layout".
|
|
20
|
+
|
|
21
|
+
The land pattern's frame is the frame of the vendor's HFSS model
|
|
22
|
+
(``HFSS_MODEL_URL``): x = 0 is the body face, which sits on the board edge,
|
|
23
|
+
+x runs into the board along the centre pad, and the pads are centred on
|
|
24
|
+
y = 0. Place the part with its origin on the board edge and its +x axis
|
|
25
|
+
pointing into the board.
|
|
26
|
+
|
|
27
|
+
The courtyard, on the top and on the bottom, covers what sits on the board:
|
|
28
|
+
the pads, and the shell's ground tabs, which the vendor model puts at x 0 to
|
|
29
|
+
4.76 within the body's 9.52 mm width. It starts at the board edge, since the
|
|
30
|
+
body behind the face hangs off the board.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
from jitx.component import Component
|
|
36
|
+
from jitx.feature import Courtyard
|
|
37
|
+
from jitx.landpattern import Landpattern, PadMapping
|
|
38
|
+
from jitx.layerindex import Side
|
|
39
|
+
from jitx.net import Port
|
|
40
|
+
from jitx.shapes.composites import rectangle
|
|
41
|
+
from jitxlib.landpatterns.pads import SMDPad
|
|
42
|
+
from jitxlib.symbols.box import BoxSymbol
|
|
43
|
+
|
|
44
|
+
CENTER_PAD_WIDTH = 0.61
|
|
45
|
+
"""Datasheet recommended land pattern: centre pad 0.61 +/-0.05 wide."""
|
|
46
|
+
|
|
47
|
+
CENTER_PAD_LENGTH = 1.97
|
|
48
|
+
"""Datasheet recommended land pattern: centre pad 1.97 minimum from the PCB
|
|
49
|
+
end."""
|
|
50
|
+
|
|
51
|
+
GROUND_OUTER = 9.9
|
|
52
|
+
"""Datasheet recommended land pattern: ground pads 9.9 +/-0.05 outer overall
|
|
53
|
+
width."""
|
|
54
|
+
|
|
55
|
+
GROUND_INNER = 7.1
|
|
56
|
+
"""Datasheet recommended land pattern: ground pads 7.1 +/-0.05 inner overall
|
|
57
|
+
width."""
|
|
58
|
+
|
|
59
|
+
GROUND_LENGTH = 5.0
|
|
60
|
+
"""Datasheet recommended land pattern: ground pads 5.0 +/-0.05 long, top and
|
|
61
|
+
bottom."""
|
|
62
|
+
|
|
63
|
+
BODY_WIDTH = 9.52
|
|
64
|
+
"""Datasheet: body 9.52 by 7.92; the vendor model spans y -4.76 to 4.76, so
|
|
65
|
+
9.52 is the width across the board edge."""
|
|
66
|
+
|
|
67
|
+
TAB_REACH = 4.76
|
|
68
|
+
"""Vendor model (``HFSS_MODEL_URL``): the shell's ground tabs reach x = 4.76
|
|
69
|
+
into the board."""
|
|
70
|
+
|
|
71
|
+
COURTYARD_EXCESS = 0.25
|
|
72
|
+
"""Courtyard margin beyond the pads and tabs, in mm, as the Molex and
|
|
73
|
+
Weidmuller connectors in this package use."""
|
|
74
|
+
|
|
75
|
+
HFSS_MODEL_URL = (
|
|
76
|
+
"https://www.we-online.com/components/products/download/"
|
|
77
|
+
"ANSYS_60312202114514%20%28rev25a%29.a3dcomp"
|
|
78
|
+
)
|
|
79
|
+
"""The vendor's HFSS 3D component (``.a3dcomp``) for this part, rev25a,
|
|
80
|
+
kept for later use: nothing in this repository downloads or reads it yet.
|
|
81
|
+
The file was recorded by 2026-11-05 as 390,182 bytes, with the SHA-256 in
|
|
82
|
+
``HFSS_MODEL_SHA256``; check a download against both. Its native frame is
|
|
83
|
+
the land pattern's frame: x = 0 at the body face on the board edge, +x into
|
|
84
|
+
the board, and z = 0 on the top copper."""
|
|
85
|
+
|
|
86
|
+
HFSS_MODEL_SHA256 = "54cdf702be7343e09a787fa0de413e77984569b4b6bcdddee27d8adccfc90959"
|
|
87
|
+
"""SHA-256 of the rev25a file at ``HFSS_MODEL_URL``, to check a download
|
|
88
|
+
against."""
|
|
89
|
+
|
|
90
|
+
_GROUND_PAD_WIDTH = (GROUND_OUTER - GROUND_INNER) / 2
|
|
91
|
+
_GROUND_PAD_Y = (GROUND_OUTER + GROUND_INNER) / 4
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class WurthLaunchLandpattern(Landpattern):
|
|
95
|
+
"""The centre pad, and a ground pad on each side of it on the top and on
|
|
96
|
+
the bottom of the board, each with a soldermask opening and paste, and a
|
|
97
|
+
courtyard on each side."""
|
|
98
|
+
|
|
99
|
+
def __init__(self) -> None:
|
|
100
|
+
self.sig = SMDPad(rectangle(CENTER_PAD_LENGTH, CENTER_PAD_WIDTH)).at(
|
|
101
|
+
CENTER_PAD_LENGTH / 2, 0.0
|
|
102
|
+
)
|
|
103
|
+
self.gnd = [
|
|
104
|
+
SMDPad(rectangle(GROUND_LENGTH, _GROUND_PAD_WIDTH)).at(
|
|
105
|
+
GROUND_LENGTH / 2, y, on=side
|
|
106
|
+
)
|
|
107
|
+
for side in (Side.Top, Side.Bottom)
|
|
108
|
+
for y in (_GROUND_PAD_Y, -_GROUND_PAD_Y)
|
|
109
|
+
]
|
|
110
|
+
reach = max(GROUND_LENGTH, TAB_REACH) + COURTYARD_EXCESS
|
|
111
|
+
half = max(GROUND_OUTER, BODY_WIDTH) / 2 + COURTYARD_EXCESS
|
|
112
|
+
self.courtyard = [
|
|
113
|
+
Courtyard(rectangle(reach, 2 * half).at(reach / 2, 0.0), side=side)
|
|
114
|
+
for side in (Side.Top, Side.Bottom)
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class Wurth60312202114514(Component):
|
|
119
|
+
"""Würth Elektronik WR-SMA 60312202114514, 50 ohm end launch jack, flat
|
|
120
|
+
tab, for a 1.6 mm board."""
|
|
121
|
+
|
|
122
|
+
manufacturer = "Würth Elektronik"
|
|
123
|
+
mpn = "60312202114514"
|
|
124
|
+
datasheet = (
|
|
125
|
+
"https://www.we-online.com/components/products/datasheet/60312202114514.pdf"
|
|
126
|
+
)
|
|
127
|
+
reference_designator_prefix = "J"
|
|
128
|
+
|
|
129
|
+
sig = Port()
|
|
130
|
+
"""The centre pin."""
|
|
131
|
+
gnd = Port()
|
|
132
|
+
"""The shell: all four ground pads."""
|
|
133
|
+
|
|
134
|
+
def __init__(self) -> None:
|
|
135
|
+
self.landpattern = WurthLaunchLandpattern()
|
|
136
|
+
self.symbol = BoxSymbol()
|
|
137
|
+
self.mappings = [
|
|
138
|
+
PadMapping({self.sig: self.landpattern.sig, self.gnd: self.landpattern.gnd})
|
|
139
|
+
]
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
Device: type[Wurth60312202114514] = Wurth60312202114514
|
|
@@ -400,13 +400,13 @@ class TPS62933DRLRCircuit(Circuit):
|
|
|
400
400
|
BstTag().assign(self.BST_MID)
|
|
401
401
|
|
|
402
402
|
# Design rule constraints
|
|
403
|
-
# 0.
|
|
403
|
+
# 0.25mm clearance for SW_NODE (switch node needs clearance from other nets)
|
|
404
404
|
self.sw_clearance_rule = design_constraint(SwTag(), True).clearance(0.25)
|
|
405
405
|
|
|
406
|
-
# 0.
|
|
406
|
+
# 0.25mm clearance for BST_MID (bootstrap node needs clearance from other nets)
|
|
407
407
|
self.bst_clearance_rule = design_constraint(BstTag(), True).clearance(0.25)
|
|
408
408
|
|
|
409
|
-
#
|
|
409
|
+
# 0.25mm trace width for VIN and VOUT power nets
|
|
410
410
|
self.power_trace_rule = design_constraint(PowerNetTag()).trace_width(0.25)
|
|
411
411
|
|
|
412
412
|
|
{jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/bga_escape.py
RENAMED
|
@@ -358,7 +358,6 @@ class BGALink(Circuit):
|
|
|
358
358
|
lane.signal_via_fence_shape,
|
|
359
359
|
layer=spec.upper_ref_fence_pour_layer,
|
|
360
360
|
rank=_ANTIPAD_FENCE_POUR_RANK,
|
|
361
|
-
isolate=0.0,
|
|
362
361
|
)
|
|
363
362
|
spec.upper_ref_fence_tag.assign(p)
|
|
364
363
|
signal_via_fence_pours.append(p)
|
|
@@ -367,7 +366,6 @@ class BGALink(Circuit):
|
|
|
367
366
|
lane.deskew_fence_pour_shape,
|
|
368
367
|
layer=spec.deskew_antipad_fence_pour_layer,
|
|
369
368
|
rank=_DESKEW_ANTIPAD_FENCE_POUR_RANK,
|
|
370
|
-
isolate=0.0,
|
|
371
369
|
)
|
|
372
370
|
spec.deskew_antipad_fence_tag.assign(dp)
|
|
373
371
|
deskew_fence_pours.append(dp)
|
|
@@ -389,13 +387,21 @@ class BGALink(Circuit):
|
|
|
389
387
|
n_conductors = len(substrate.stackup.conductors)
|
|
390
388
|
gnd_pour_shape = rectangle(48, 48, radius=4)
|
|
391
389
|
self.gnd_pours = [
|
|
392
|
-
Pour(gnd_pour_shape, layer=layer, rank=1
|
|
393
|
-
for layer in range(n_conductors)
|
|
390
|
+
Pour(gnd_pour_shape, layer=layer, rank=1) for layer in range(n_conductors)
|
|
394
391
|
]
|
|
395
392
|
|
|
396
393
|
# GND-via stitching around every BGA GND ball. The site-planning
|
|
397
394
|
# helper returns pure data; this Circuit constructs the actual
|
|
398
395
|
# Via instances and owns them as a named structural member.
|
|
396
|
+
# These stay code-placed rather than a ``stitch_via`` rule: each is
|
|
397
|
+
# via-in-pad at a GND ball centre, and its via class reaches the
|
|
398
|
+
# reference plane below that row pair's signal layer. The
|
|
399
|
+
# code-placed vias also count as same-net objects for the GND pours
|
|
400
|
+
# on the layers they span: a pour with no pad or via of its own net
|
|
401
|
+
# inside it comes back empty (measured on jitx 4.6). A stitch
|
|
402
|
+
# rule's own vias do not hold such a pour: the runtime still places
|
|
403
|
+
# them on the removed pour's footprint, with no issue (measured on
|
|
404
|
+
# jitx 4.6).
|
|
399
405
|
self.gnd_stitching_vias = [
|
|
400
406
|
substrate.gnd_via[signal_layer]().at(*bga.ball_center(row, col))
|
|
401
407
|
for row, col, signal_layer in gnd_pad_via_sites()
|
{jitxexamples-2.0.0 → jitxexamples-2.1.0}/src/jitxexamples/demos/si_bga_optimization/substrate.py
RENAMED
|
@@ -97,7 +97,6 @@ def _rs_uncoupled_layer(signal_layer: int) -> "RoutingStructure.Layer":
|
|
|
97
97
|
clearance=0.135,
|
|
98
98
|
velocity=VEL_STRIPLINE,
|
|
99
99
|
insertion_loss=0.018,
|
|
100
|
-
neck_down=RoutingStructure.NeckDown(trace_width=0.10, clearance=0.135),
|
|
101
100
|
)
|
|
102
101
|
.reference(signal_layer - 1, 1.0)
|
|
103
102
|
.reference(signal_layer + 1, 1.0)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""JS4 reference solution: SI constraints on the JS1 VP1002 driving a Micron
|
|
2
|
+
LPDDR4X device.
|
|
3
|
+
|
|
4
|
+
- :py:mod:`.constraint`: UG863's skew limits and trace length budget as a
|
|
5
|
+
reusable constraint.
|
|
6
|
+
- :py:mod:`.models`: package delay pin models from a package delay file,
|
|
7
|
+
and microvia delay models from the stackup.
|
|
8
|
+
- :py:mod:`.main`: the shipping design, with no routes.
|
|
9
|
+
- :py:mod:`.proof`: code-routed verification designs that measure the
|
|
10
|
+
constraints, before and after a tighter limit.
|
|
11
|
+
|
|
12
|
+
The FPGA's pin offer is a supplied part,
|
|
13
|
+
:py:mod:`jitxexamples.jumpstart_kits.vp1002_lpddr4x`.
|
|
14
|
+
"""
|