jitxexamples 1.6.0__tar.gz → 1.6.2__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.
Files changed (236) hide show
  1. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/CLAUDE.md +18 -15
  2. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/PKG-INFO +1 -1
  3. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js0-setup/JS0_Environment_Setup.md +5 -3
  4. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js0-setup/JS0_Reference_Companion.md +2 -2
  5. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js0-setup/JS0_Setup_Runbook.md +11 -5
  6. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/README.md +1 -1
  7. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part1-stackup/JS1_Part1_Stackup-from-Fab-CSV_Runbook.md +8 -5
  8. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part2-parametric-passives/JS1_Part2_Parametric-Passives_Runbook.md +7 -6
  9. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part3-versal-fpga/JS1_Part3_Reference_Companion.md +5 -4
  10. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part3-versal-fpga/JS1_Part3_Versal-FPGA-from-Pin-File_Runbook.md +29 -15
  11. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part3-versal-fpga/README.md +1 -1
  12. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup/board.py +1 -1
  13. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/components/yageo_rc.py +4 -2
  14. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/tools/generate_pinout.py +3 -3
  15. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/test.log +47 -43
  16. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_js1_versal_fpga.py +59 -0
  17. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/.github/workflows/build.yaml +0 -0
  18. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/.github/workflows/mirror-main.yml +0 -0
  19. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/.github/workflows/release.yaml +0 -0
  20. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/.gitignore +0 -0
  21. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/README.md +0 -0
  22. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/build.err +0 -0
  23. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/build.log +0 -0
  24. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/captured_json/capacitor_minimal.json +0 -0
  25. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/captured_json/inductor_minimal.json +0 -0
  26. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/captured_json/resistor_minimal.json +0 -0
  27. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/docs/Makefile +0 -0
  28. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/docs/requirements.txt +0 -0
  29. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/docs/source/conf.py +0 -0
  30. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/docs/source/index.rst +0 -0
  31. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/hooks/pre-commit +0 -0
  32. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/README.md +0 -0
  33. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js0-setup/README.md +0 -0
  34. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js0-setup/presentation/JS0_Presentation.pdf +0 -0
  35. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js0-setup/presentation/JS0_Presentation.pptx +0 -0
  36. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js0-setup/presentation/README.md +0 -0
  37. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part1-stackup/JS1_Part1_Fab-Stackup.csv +0 -0
  38. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part1-stackup/JS1_Part1_Stackup_Presentation.pdf +0 -0
  39. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part1-stackup/JS1_Part1_Stackup_Presentation.pptx +0 -0
  40. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part1-stackup/README.md +0 -0
  41. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part2-parametric-passives/JS1_Part2_Parametric-Passives_Presentation.pdf +0 -0
  42. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part2-parametric-passives/JS1_Part2_Parametric-Passives_Presentation.pptx +0 -0
  43. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part2-parametric-passives/README.md +0 -0
  44. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part3-versal-fpga/JS1_Part3_Versal-FPGA_Presentation.pdf +0 -0
  45. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js1-stackup-components/part3-versal-fpga/JS1_Part3_Versal-FPGA_Presentation.pptx +0 -0
  46. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/js2-circuits/README.md +0 -0
  47. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/shared/JITX_Architecture_and_Systems_Requirements_v2_0.md +0 -0
  48. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/shared/README.md +0 -0
  49. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/shared/images/JITX_Architecture_Fig1_Deployment.png +0 -0
  50. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/jumpstart-kits/shared/images/JITX_Architecture_FigA1_Workflow.png +0 -0
  51. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/lint.log +0 -0
  52. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/pyproject.toml +0 -0
  53. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/__init__.py +0 -0
  54. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/audio_amps/PAM8302AADCR.py +0 -0
  55. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/battery_managers/BQ24078RGTR.py +0 -0
  56. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/battery_managers/BQ24078RGTR.stp +0 -0
  57. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/battery_managers/PH2_0_2PWB.py +0 -0
  58. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/bjts/BJT_2N3904S_RTKPS.py +0 -0
  59. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/buttons/PTS810SJM250SMTRLFS.py +0 -0
  60. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/buttons/__init__.py +0 -0
  61. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/buttons/xunpu_TS_1088_AR02016.py +0 -0
  62. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/buttons/xunpu_TS_1088_AR02016.stp +0 -0
  63. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/__init__.py +0 -0
  64. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/hirose_electric_co_ltd_U_FL_R_SMT_10.py +0 -0
  65. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/molex_2012670005.py +0 -0
  66. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/myoung_MY_1632_03.py +0 -0
  67. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/pulse_electronics_JD0_0001NL.py +0 -0
  68. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/q_j_CR2032_BS_6_1.py +0 -0
  69. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/q_j_CR2032_BS_6_1.stp +0 -0
  70. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/connectors/weidmuller_LSF_SMT.py +0 -0
  71. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/crystals/HC_49SM12MHz20pF30ppm.py +0 -0
  72. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/crystals/__init__.py +0 -0
  73. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/crystals/yangxing_tech_X322512MSB4SI.py +0 -0
  74. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/crystals/yangxing_tech_X322512MSB4SI.stp +0 -0
  75. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/digital_isolators/PUSB3FR4.py +0 -0
  76. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/diodes_tvs/__init__.py +0 -0
  77. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/diodes_tvs/littelfuse_SMBJ43CA.py +0 -0
  78. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/diodes_tvs/littelfuse_SMBJ43CA.stp +0 -0
  79. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/fets_n_ch/BSN20.py +0 -0
  80. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/fets_n_ch/BSS138.py +0 -0
  81. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/fets_n_ch/BSS138.stp +0 -0
  82. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/fets_p_ch/AO3401A.py +0 -0
  83. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/fets_p_ch/AO6409.py +0 -0
  84. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/fets_p_ch/AO6409.stp +0 -0
  85. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/flash/__init__.py +0 -0
  86. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/flash/winbond_W25Q128JVSIQ.py +0 -0
  87. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/flash/winbond_W25Q128JVSIQ.stp +0 -0
  88. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/isolators/__init__.py +0 -0
  89. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/isolators/texas_instruments_ISO1211.py +0 -0
  90. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/led_drivers/IS31FL3236A_QFLS2_TR.py +0 -0
  91. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/KT_0603G.py +0 -0
  92. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/KT_0603G.stp +0 -0
  93. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/KT_0603R.py +0 -0
  94. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/KT_0603W.py +0 -0
  95. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/KT_0603W.stp +0 -0
  96. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/KT_0603Y.py +0 -0
  97. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/WS2816C_2121.py +0 -0
  98. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/__init__.py +0 -0
  99. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/foshan_nationstar_optoelectronics_FM_B2020RGBA_HG.py +0 -0
  100. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/togialed_TJ_S3210SW5TGLC2R_A5.py +0 -0
  101. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/leds/togialed_TJ_S3210SW5TGLC2R_A5.stp +0 -0
  102. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/level_translators/logic_level_shifter.py +0 -0
  103. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/logic/__init__.py +0 -0
  104. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/logic/texas_instruments_SN74HC14PWR.py +0 -0
  105. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/logic/texas_instruments_SN74HC14PWR.stp +0 -0
  106. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/mcus/__init__.py +0 -0
  107. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/mcus/nordic_NRF52840_QIAA_R.py +0 -0
  108. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/mcus/raspberry_pi_RP2040.py +0 -0
  109. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/memories/W25Q128JVSIQTR.py +0 -0
  110. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/microphones/__init__.py +0 -0
  111. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/microphones/allpower_AP3722AT.py +0 -0
  112. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/opamps/__init__.py +0 -0
  113. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/opamps/stmicroelectronics_TS971ILT.py +0 -0
  114. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/opamps/texas_instruments_OPA189.py +0 -0
  115. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/opamps/texas_instruments_TLV314IDBVR.py +0 -0
  116. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/opamps/texas_instruments_TLV314IDBVR.stp +0 -0
  117. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/passives/RK09K1130AP5.py +0 -0
  118. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_linear_regulators/AP2125K_2_8TRG1.py +0 -0
  119. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_linear_regulators/NCP1117LPST33T3G.py +0 -0
  120. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_linear_regulators/__init__.py +0 -0
  121. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_linear_regulators/analog_devices_LT1763CS8.py +0 -0
  122. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_linear_regulators/analog_devices_LT1763CS8.stp +0 -0
  123. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_linear_regulators/texas_instruments_LM1117MP.py +0 -0
  124. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_switches/high_side_switch.py +0 -0
  125. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_switchmode/__init__.py +0 -0
  126. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/power_switchmode/texas_instruments_TPS62933DRLR.py +0 -0
  127. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/sensors/__init__.py +0 -0
  128. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/sensors/stmicroelectronics_LIS3DHTR.py +0 -0
  129. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/sensors_distance/VL53L0CXV0DH_1.py +0 -0
  130. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/switches/MK_12C02_G025.py +0 -0
  131. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/timers/__init__.py +0 -0
  132. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/timers/texas_instruments_NE555.py +0 -0
  133. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/transceivers/__init__.py +0 -0
  134. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/transceivers/texas_instruments_SN65HVD1781DR.py +0 -0
  135. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/transceivers/texas_instruments_SN65HVD1781DR.stp +0 -0
  136. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/transistors/__init__.py +0 -0
  137. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/transistors/changjiang_electronics_tech_BSS138.py +0 -0
  138. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/transistors/on_semiconductor_NTA4151PT1G.py +0 -0
  139. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/components/transistors/seiko_epson_TSX_3225_32_0000MF10Z_W6.py +0 -0
  140. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/__init__.py +0 -0
  141. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/si_bga_optimization/__init__.py +0 -0
  142. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/si_bga_optimization/bga_escape.py +0 -0
  143. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/si_bga_optimization/constraints.py +0 -0
  144. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/si_bga_optimization/deskew.py +0 -0
  145. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/si_bga_optimization/generic_bga.py +0 -0
  146. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/si_bga_optimization/si_geometry.py +0 -0
  147. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/demos/si_bga_optimization/substrate.py +0 -0
  148. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/__init__.py +0 -0
  149. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/__init__.py +0 -0
  150. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup/__init__.py +0 -0
  151. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup/main.py +0 -0
  152. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/__init__.py +0 -0
  153. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/combined.py +0 -0
  154. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/components/__init__.py +0 -0
  155. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/components/chip_smt.py +0 -0
  156. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/components/panasonic_erj.py +0 -0
  157. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/components/resistor.py +0 -0
  158. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/components/samsung_cl.py +0 -0
  159. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/components/vishay_crcw.py +0 -0
  160. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/parametric_passives/main.py +0 -0
  161. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/__init__.py +0 -0
  162. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/bundles.py +0 -0
  163. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/circuit.py +0 -0
  164. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/landpattern.py +0 -0
  165. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/main.py +0 -0
  166. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/symbols.py +0 -0
  167. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/tools/__init__.py +0 -0
  168. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga/xcvp1002.py +0 -0
  169. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/substrates/__init__.py +0 -0
  170. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/src/jitxexamples/substrates/generic_20layer.py +0 -0
  171. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/test.err +0 -0
  172. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/__init__.py +0 -0
  173. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/conftest.py +0 -0
  174. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_AO3401A.py +0 -0
  175. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_AO6409.py +0 -0
  176. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_AP2125K_2_8TRG1.py +0 -0
  177. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_BJT_2N3904S_RTKPS.py +0 -0
  178. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_BQ24078RGTR.py +0 -0
  179. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_BSN20.py +0 -0
  180. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_BSS138.py +0 -0
  181. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_HC_49SM12MHz20pF30ppm.py +0 -0
  182. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_IS31FL3236A_QFLS2_TR.py +0 -0
  183. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_KT_0603G.py +0 -0
  184. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_KT_0603R.py +0 -0
  185. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_KT_0603W.py +0 -0
  186. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_KT_0603Y.py +0 -0
  187. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_MK_12C02_G025.py +0 -0
  188. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_NCP1117LPST33T3G.py +0 -0
  189. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_PAM8302AADCR.py +0 -0
  190. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_PH2_0_2PWB.py +0 -0
  191. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_PTS810SJM250SMTRLFS.py +0 -0
  192. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_PUSB3FR4.py +0 -0
  193. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_RK09K1130AP5.py +0 -0
  194. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_VL53L0CXV0DH_1.py +0 -0
  195. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_W25Q128JVSIQTR.py +0 -0
  196. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_WS2816C_2121.py +0 -0
  197. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_allpower_ap3722at.py +0 -0
  198. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_analog_devices_lt1763cs8.py +0 -0
  199. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_bga_optimization_demo.py +0 -0
  200. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_changjiang_electronics_tech_bss138.py +0 -0
  201. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_foshan_nationstar_optoelectronics_fm_b2020rgba_hg.py +0 -0
  202. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_high_side_switch.py +0 -0
  203. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_hirose_electric_co_ltd_u_fl_r_smt_10.py +0 -0
  204. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_iso1211.py +0 -0
  205. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_jd0_0001nl.py +0 -0
  206. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_js1_hdi_stackup.py +0 -0
  207. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_js1_panasonic_erj.py +0 -0
  208. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_js1_parametric_passives.py +0 -0
  209. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_js1_samsung_cl.py +0 -0
  210. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_js1_vishay_crcw.py +0 -0
  211. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_js1_yageo_rc.py +0 -0
  212. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_littelfuse_smbj43ca.py +0 -0
  213. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_lm1117mp.py +0 -0
  214. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_logic_level_shifter.py +0 -0
  215. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_lsf_smt.py +0 -0
  216. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_molex_2012670005.py +0 -0
  217. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_myoung_my_1632_03.py +0 -0
  218. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_ne555.py +0 -0
  219. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_nordic_nrf52840_qiaa_r.py +0 -0
  220. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_on_semiconductor_nta4151pt1g.py +0 -0
  221. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_opa189.py +0 -0
  222. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_q_j_cr2032_bs_6_1.py +0 -0
  223. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_rp2040.py +0 -0
  224. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_seiko_epson_tsx_3225.py +0 -0
  225. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_sn65hvd1781dr.py +0 -0
  226. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_stmicroelectronics_lis3dhtr.py +0 -0
  227. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_stmicroelectronics_ts971ilt.py +0 -0
  228. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_texas_instruments_sn74hc14pwr.py +0 -0
  229. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_texas_instruments_tlv314idbvr.py +0 -0
  230. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_togialed_tj_s3210sw5tglc2r_a5.py +0 -0
  231. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_tps62933drlr.py +0 -0
  232. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_w25q128.py +0 -0
  233. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_xunpu_ts_1088_ar02016.py +0 -0
  234. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/tests/test_yangxing_tech_x322512msb4si.py +0 -0
  235. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/typecheck.err +0 -0
  236. {jitxexamples-1.6.0 → jitxexamples-1.6.2}/typecheck.log +0 -0
@@ -24,21 +24,24 @@ specifically about working *with an agent* in this repo.
24
24
  context, so instantiating a `SampleDesign` works offline. Only `jitx build` / `jitx ui` need
25
25
  `jitx runtime start`; `jitx build --dry <target>` translates a design without one.
26
26
 
27
- - **JITX 4.4.0 is public, and the parked-changes list is `internal/JITX-4.4-RELEASE-ACTIONS.md`.**
28
- Read it before planning work here: it says what is already done so you don't redo it, and what is
29
- still open. Two items were still open as of 2026-08-31 — deleting
30
- `vishay_crcw._STANDARD_TABLE_OVERRIDES` (its trigger fired long ago) and regenerating
31
- `JS0_Environment_Setup.md` Appendix A, whose dependency table is still a 4.2-line snapshot. The
32
- file's runtime-surface check (`jitx runtime introspect` reporting a 4.4.x `release` build) had not
33
- been run at that point either.
34
-
35
- - **The repo targets the jitx 4.4 line, and public PyPI now serves it.** `pyproject.toml` requires
36
- `jitx>=4.4.0,<5`, which resolves from public PyPI — the pre-release specifier and the
37
- CI-can't-install caveat are both gone. The `hatch` envs still add the internal index
38
- (`PIP_EXTRA_INDEX_URL`), so they resolve *ahead* of the public line: expect a `4.4.x.devN` build
39
- there rather than 4.4.0 exactly. Before concluding that demo code is broken, check which `jitx`
40
- you resolved, and note that `jitx build` also needs the runtime (`~/.jitx/current`) on the same
41
- line as the library.
27
+ - **The repo targets the jitx 4.4 line, and public PyPI serves it.** `pyproject.toml` requires
28
+ `jitx>=4.4.0,<5`. Two surfaces have to agree — a 4.4 package against a 4.2 runtime is not a
29
+ working install — so `jitx build` also needs the runtime (`~/.jitx/current`, check with
30
+ `jitx runtime introspect`) on the same line as the library. Before concluding demo code is broken,
31
+ check which `jitx` you actually resolved on both.
32
+
33
+ - **A maintainer machine does not resolve what a customer resolves.** Developer setups here carry an
34
+ internal index and a pre-release opt-in, and they are not all environment variables —
35
+ `~/.pip/pip.conf` can set `extra-index-url` and `pre = true`, which `env -u PIP_EXTRA_INDEX_URL`
36
+ does not strip. To reproduce a customer's resolution, neutralise the config file as well:
37
+
38
+ ```bash
39
+ env -u PIP_PRE -u PIP_EXTRA_INDEX_URL -u UV_PRERELEASE -u UV_EXTRA_INDEX_URL \
40
+ PIP_CONFIG_FILE=/dev/null hatch test --cover
41
+ ```
42
+
43
+ Confirm what you got (`pip list | grep jitx`) rather than assuming: a `.dev`, `a` or `rc` suffix
44
+ means the isolation did not hold. Without it the `hatch` envs resolve *ahead* of the public line.
42
45
 
43
46
  - **The parts database is mocked in tests.** `tests/conftest.py` installs an autouse fixture
44
47
  patching `jitxlib.parts.query_api.dbquery` with fixtures from `captured_json/` and sets
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: jitxexamples
3
- Version: 1.6.0
3
+ Version: 1.6.2
4
4
  Summary: Library of example JITX components, substrates, and demo designs
5
5
  Project-URL: Homepage, https://jitx.com
6
6
  Project-URL: Documentation, https://docs.jitx.com
@@ -212,6 +212,7 @@ to `@jitx <request to AI>` for general work). For example:
212
212
 
213
213
  - [ ] VSCode (or Cursor / Windsurf / Devin) installed **[Engineer]**
214
214
  - [ ] Python 3.12+ available to the editor **[Engineer]**
215
+ - [ ] Windows: `PYTHONUTF8` = `1` set as a user environment variable (same steps as [Appendix B](#appendix-b--memory-configuration-for-large-designs)) — the default `cp1252` console rejects the `Ω` and `→` in JITX output **[Engineer]**
215
216
  - [ ] JITX extension installed (pulls in JITX packages + runtime) **[IT/Admin + Engineer]**
216
217
  - [ ] First project created successfully **[Engineer]**
217
218
 
@@ -247,9 +248,10 @@ dependency set**, captured from a freshly scaffolded project on **JITX 4.4.0 wit
247
248
  the versions are **not** the floor and they move with each release, so regenerate it for the version
248
249
  you are deploying with `pip list` in the project venv.
249
250
 
250
- > Note: the JITX runtime version and the Python package versions do not track one-to-one — the
251
- > `jitx` and `jitxcore` packages report their own version numbers. Expect them to differ from the
252
- > runtime version; the two are versioned independently.
251
+ > Note: the JITX runtime and the `jitx` / `jitxcore` Python packages must sit on the **same release
252
+ > line** — the same major.minor, e.g. a 4.4.x runtime with 4.4.x packages. Patch numbers can differ;
253
+ > release lines cannot — a 4.4 package against a 4.2 runtime is not a working install. `jitx runtime
254
+ > introspect` reports the runtime, `pip show jitx` the package.
253
255
 
254
256
  | Package | Version |
255
257
  | --- | --- |
@@ -1,4 +1,4 @@
1
- <!-- JITX Setup — Reference Companion (JS0) · rev 1.4 · 2026-08-31 -->
1
+ <!-- JITX Setup — Reference Companion (JS0) · rev 1.5 · 2026-09-08 -->
2
2
 
3
3
  # JITX Setup — Reference Companion (JS0)
4
4
 
@@ -16,7 +16,7 @@ Run these in a terminal — you'll get a working, authenticated install, proven
16
16
  2. **Install the JITX CLI.** `pip install jitx`. If you hit the PEP 668 "externally-managed-environment" error — the Python packaging rule that stops `pip` writing into a system-managed interpreter — install `uv` (https://astral.sh/uv) and run `uv tool install jitx` instead. Verify: `jitx --version`.
17
17
  3. **Install the runtime.** `jitx runtime install` — do this **before** signing in. **On Windows**, this launches an MSI installer in a separate popup window (possibly behind others) — complete it to finish. If it fails with `not tested on Linux distribution '<x>'`, retry as `jitx runtime install --target ubuntu`; the Ubuntu build runs on most glibc Linux. Check it with `jitx runtime introspect`, which works anywhere — `jitx runtime status` is project-scoped and fails with `No pyproject.toml found` until you create the project in step 5.
18
18
  4. **Sign in.** `jitx auth login` prints an activation link and a code; open it in any browser, approve, and the command completes on its own. It does not launch the browser for you, which matters on a headless or remote machine. **The link expires in 10 minutes** — re-run the command if it lapses. In the browser, **Sign in with Google** is simplest; if you're **not** using a Google-enabled account, enter your registered email and JITX password. Confirm with `jitx auth show`: **`Authorized: yes`** is the field that matters, and an `Expires` in the past is normal — the value shown is always the pre-refresh one, because the authorization check that renews the token runs after the claims are read.
19
- 5. **Validate with two builds.** The global CLI (step 2) has no `pip`, so run this inside each project once it exists. Create and activate a virtual environment — `python3 -m venv .venv && source .venv/bin/activate` on macOS or Linux, or `py -3.12 -m venv .venv` then `.\.venv\Scripts\Activate.ps1` in Windows PowerShell — then `pip install jitx`, `jitx project dependencies upgrade`, `jitx runtime start --background`, and `jitx find`.
19
+ 5. **Validate with two builds.** The global CLI (step 2) has no `pip`, so run this inside each project once it exists. Create and activate a virtual environment — `python3 -m venv .venv && source .venv/bin/activate` on macOS or Linux, or `$env:PYTHONUTF8 = "1"; py -3 -m venv .venv` then `.\.venv\Scripts\Activate.ps1` in Windows PowerShell — then `pip install jitx`, `jitx project dependencies upgrade`, `jitx runtime start --background`, and `jitx find`. After the upgrade, `pip show jitx` and `jitx runtime introspect` should report the same release line (4.4.x with 4.4.x). **On Windows**, `PYTHONUTF8=1` keeps the `cp1252` console from choking on `Ω`; and a `WinError 32` from the upgrade means pip is replacing the running `jitx.exe` — run `.\.venv\Scripts\python.exe -m pip install --upgrade jitx` and re-run the upgrade.
20
20
  - **Simplest.** Create a new project with `jitx project layout init` (this seeds a two-resistor sample design). Build the seeded non-test target from `jitx find` — ignore any target whose module path comes from `test`, `tests`, or a test file. **Take the target verbatim from `jitx find`** — the two halves are derived differently, so don't assemble it yourself: the package is the directory lowercased with hyphens and spaces turned into underscores, while the design class is that same name in CapWords. A directory called `my-first-board` builds as `jitx build my_first_board.main.MyFirstBoard`. Then open the views with `jitx ui open --schematic` and `jitx ui open --board`.
21
21
  - **Full.** Clone `https://github.com/JITx-Inc/jitx-examples` and build the [`si_bga_optimization`](https://github.com/JITx-Inc/jitx-examples/tree/main/src/jitxexamples/demos/si_bga_optimization) design, taking the target verbatim from `jitx find` as above — expect `jitxexamples.demos.si_bga_optimization.bga_escape.bga_optimization_design`. Open the board view to confirm.
22
22
  - **`jitx ui open` holds the terminal** while its window is open — use a second terminal, or background it, for the next command. Later calls return straight away and add their windows to the JITX app already running; there's no limit on how many views can be open at once, so leave the Simplest build's windows up.
@@ -1,5 +1,5 @@
1
1
  <!--
2
- JITX Setup Runbook (JS0) · rev 1.4 · 2026-08-31
2
+ JITX Setup Runbook (JS0) · rev 1.5 · 2026-09-08
3
3
  Paste this file into your AI coding agent (Claude Code, Codex / GPT, or Devin), or upload it,
4
4
  and tell the agent to follow it.
5
5
  -->
@@ -19,7 +19,7 @@ and tell the agent to follow it.
19
19
  **Assumptions / prerequisites**
20
20
 
21
21
  - Python 3.12+ and `git` are available.
22
- - You are running inside an AI coding agent that can execute shell commands (not sandboxed).
22
+ - You are running inside an AI coding agent that can execute shell commands (not sandboxed). If your harness gates commands or network access behind approval prompts, expect them at the installers (steps 1–2), the background runtime start, the `git clone`, and each `jitx ui open` — approve them; none of those steps works from a read-only sandbox.
23
23
  - (Optional) A code editor is installed (VSCode, Cursor, or Windsurf/Devin).
24
24
 
25
25
  ---
@@ -78,7 +78,7 @@ Drive these with the base JITX skill (step 4). The step-1 CLI has no `pip`, so r
78
78
  python3 -m venv .venv && source .venv/bin/activate
79
79
 
80
80
  # Windows (PowerShell)
81
- py -3.12 -m venv .venv; .\.venv\Scripts\Activate.ps1
81
+ $env:PYTHONUTF8 = "1"; py -3 -m venv .venv; .\.venv\Scripts\Activate.ps1
82
82
  ```
83
83
 
84
84
  ```bash
@@ -89,10 +89,15 @@ jitx find
89
89
  ```
90
90
 
91
91
  - **5a — Simplest build.** Run `jitx project layout init` to create a new JITX project seeded with a two-resistor sample design (Devin users: you made this project in step 4). Then run the setup commands above and build the seeded non-test target from `jitx find` — ignore any target whose module path comes from `test`, `tests`, or a test file. **Take the target verbatim from `jitx find`** — the two halves are derived differently, so don't assemble it yourself: the package is the directory lowercased with hyphens and spaces turned into underscores, while the design class is that same name in CapWords. A directory called `my-first-board` builds as `jitx build my_first_board.main.MyFirstBoard`. Then show me the schematic and board views.
92
- - **5b — Full build.** Clone `https://github.com/JITx-Inc/jitx-examples`, run the setup commands above, and **take the `si_bga_optimization` target verbatim from `jitx find`** — the same rule as 5a, so a repo reorganisation can't strand you on a stale module path. Expect `jitxexamples.demos.si_bga_optimization.bga_escape.bga_optimization_design`. Build it, confirm it builds, and display the board UI windows for me.
92
+ - **5b — Full build.** Clone `https://github.com/JITx-Inc/jitx-examples`, run the setup commands above, and **take the `si_bga_optimization` target verbatim from `jitx find`** — the same rule as 5a, so a repo reorganisation can't strand you on a stale module path. Expect `jitxexamples.demos.si_bga_optimization.bga_escape.bga_optimization_design`. Two things about this repo's output: `jitx find` also prints an `errors: import failed` block for the repo's `tests/` modules — expected here (its tests aren't a package) and not a fault; the `designs:` list is what you take the target from. And after `jitx project dependencies upgrade`, `pip show jitx` and `jitx runtime introspect` must report the same release line (4.4.x with 4.4.x) — if the upgrade moved `jitx` to a different line than the runtime, stop and tell me rather than building. Build it, confirm it builds, and display the board UI windows for me.
93
93
 
94
94
  > **If a build fails with "You are not authenticated. Please sign in through the JITX Sidebar in VSCode"**, that means step 3 didn't complete — re-run `jitx auth login`, don't go looking for VSCode. `jitx runtime start --background` succeeds while unauthenticated, so a green step 2 is not proof of sign-in, and the real one-line cause arrives underneath two Python tracebacks.
95
95
 
96
+ > **[Windows] Two things the PowerShell block is protecting you from.**
97
+ >
98
+ > - **`$env:PYTHONUTF8 = "1"` is not optional.** JITX output and these runbooks carry `Ω`, `→` and `·`, and the default `cp1252` console raises `UnicodeEncodeError` on them — a build that is otherwise fine stops on a resistor value. The line sets it for this shell only; to make it permanent, add `PYTHONUTF8` = `1` as a user environment variable the way Environment Setup's Appendix B does for the heap variables.
99
+ > - **`WinError 32` from `jitx project dependencies upgrade`** means pip is trying to replace the `jitx.exe` that is running it — it only happens when the upgrade has to move `jitx` itself. Do that one step from Python instead, then re-run the upgrade: `.\.venv\Scripts\python.exe -m pip install --upgrade jitx`, then `jitx project dependencies upgrade` again (nothing left to move).
100
+
96
101
  > **Opening the views — what to expect.**
97
102
  >
98
103
  > - **`jitx ui open` blocks while its window is open**, so launch it in the background rather than letting it hang your shell for the whole session. Later calls return immediately and add their windows to the JITX app already running — there's no limit on how many views can be open at once, so leave 5a's windows up while you open 5b's.
@@ -108,7 +113,7 @@ Report the results of both builds.
108
113
  Search the editor's (or VSCode's) marketplace for the JITX extension and install it via that editor's CLI. Ask me to confirm it's installed and its sidebar shows me authenticated.
109
114
 
110
115
  **7 · [HUMAN] Close the loop — make a live design change.**
111
- Now show me the design-as-code loop on the step-5 design. **Invite me to make a change**, then **wait for me to ask.** Report the before → after values. If the view doesn't redraw after the rebuild, reopen it — see step 5's note on how `jitx ui open` behaves.
116
+ Now show me the design-as-code loop on the step-5 design. **Invite me to make a change**, then **wait for me to ask.** Report the before → after values. The board view that is already open normally redraws on its own after the rebuild — check it (ask me what I see) before you reopen anything, and reopen only if it didn't; see step 5's note on how `jitx ui open` behaves.
112
117
 
113
118
  - **If 5b ran** — tell me I can adjust the differential-pair geometry; suggest I say: *"change the differential-pair trace width to 0.0762 mm and the pair spacing to 0.1568 mm."* Edit the constants — `DIFFPAIR_TRACE_WIDTH` → `0.0762` and `DIFFPAIR_PAIR_SPACING` → `0.1568` (in the design's `substrate.py`) — rebuild, and show me **both** the changed source lines and the updated board view. Say plainly what the edit costs: those constants are the 85 Ω stripline geometry, so the new values detune every 85 Ω signal layer. We're changing them to watch a source edit reach the board, and in real work you'd re-solve the geometry for the impedance target. **Then point me at the right layer** — select `L2-Signal1` and zoom into the BGA escape region, where the diff-pair geometry lives. The change is subtle but visible there; it won't show on the default `L1-Ground1` whole-board view.
114
119
  - **If 5b didn't build** — fall back to the 5a design: tell me I can change a resistor value, and suggest I say *"change r2 to 10 kΩ."* Edit that resistor's `resistance` in the project's `main.py`, rebuild, and show me the changed line and the updated schematic. Say which design you used.
@@ -121,3 +126,4 @@ Now show me the design-as-code loop on the step-5 design. **Invite me to make a
121
126
  - The JITX skills are visible **and invocable** in a new agent session, confirmed by actually invoking one.
122
127
  - **5a** (two-resistor template) builds, and so does **5b** (`si_bga_optimization`).
123
128
  - A prompted design change — the diff-pair edit on 5b, or a resistor value on 5a if 5b didn't build — is applied, rebuilt, and visible in both the code and the UI.
129
+ - You have listed the `jitx ui open` jobs you backgrounded, so I can close the windows myself — don't kill them; the windows are what I came to see.
@@ -71,7 +71,7 @@ a machine-readable file — so you parse it rather than transcribe it. A committ
71
71
  generator reconciles the file to exactly 1,369 balls before any component code exists, and the
72
72
  circuit wrapper lifts the flat pin map into what a board designer actually consumes: 31 `Power`
73
73
  rails, three ground domains, and six GTM transceiver quads as bundles. Verification is layered —
74
- reconciliation (parsed rows = file footer = full 37×37 grid), 17 tests and 74 subtests including
74
+ reconciliation (parsed rows = file footer = full 37×37 grid), 19 tests and 198 subtests including
75
75
  hand-read ball spot-checks, and both designs building `status: ok`. Expect roughly 2–3 hours across
76
76
  four `[HUMAN]` gates, most of it agent-autonomous.
77
77
 
@@ -1,5 +1,5 @@
1
1
  <!--
2
- JITX Stackup-from-Fab-CSV Runbook (JS1 · Part 1) · rev 1.3 · 2026-08-31
2
+ JITX Stackup-from-Fab-CSV Runbook (JS1 · Part 1) · rev 1.4 · 2026-09-08
3
3
  Paste this file into your AI coding agent (Claude Code, Codex / GPT, or Devin), or upload it,
4
4
  together with your stackup CSV, and tell the agent to follow it. Complete the JS0 Setup Runbook
5
5
  first. START A NEW AGENT SESSION before you begin — a skills install only takes effect in a
@@ -10,11 +10,12 @@ session started after it, so the session that finished JS0 cannot run this runbo
10
10
 
11
11
  **Goal (for the agent):** Turn a fabrication house's stackup report into a verified JITX substrate in a file called `board.py` — a 20-layer HDI stack, five microvia levels per side, impedance-controlled routing structures. The user-provided documentation (e.g. CSV) is the **only** ground truth: every material, thickness, via and trace width must trace to one of its rows. Estimate nothing: if the CSV doesn't state it and the substrate-modeler skill doesn't supply a labeled default for it, ask me. Follow the steps **in order**. Where a step is marked **[HUMAN]**, stop and wait for me — do not proceed until I confirm.
12
12
 
13
- > **For humans:** you need a completed **JS0** (authenticated `jitx` CLI, `jitx-skills` enabled) and a stackup CSV — `part1-stackup/JS1_Part1_Fab-Stackup.csv` from this kit, or your own fab's export. Reference solution: `pip install jitxexamples`, then [`jitxexamples.jumpstart_kits.js1_stackup_components.hdi_stackup`](https://github.com/JITx-Inc/jitx-examples/tree/main/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup).
13
+ > **For humans:** you need a completed **JS0** (authenticated `jitx` CLI, `jitx-skills` enabled) and a stackup CSV — `part1-stackup/JS1_Part1_Fab-Stackup.csv` from this kit, or your own fab's export. Reference solution: `pip install jitxexamples`, then [`jitxexamples.jumpstart_kits.js1_stackup_components.hdi_stackup`](https://github.com/JITx-Inc/jitx-examples/tree/main/src/jitxexamples/jumpstart_kits/js1_stackup_components/hdi_stackup). (The scaffold seeds `jitxexamples-components`, which shares the namespace, so `import jitxexamples` succeeding is not proof it is installed — the test is `import jitxexamples.jumpstart_kits`.)
14
14
 
15
15
  **Assumptions / prerequisites**
16
16
 
17
17
  - Python 3.12+ and `git` are available; the agent can run shell commands.
18
+ - The `jitx` library your project resolves should sit on the same release line as the CLI — if pip lands a different line, say so rather than silently proceeding.
18
19
  - The stackup CSV is in the project directory, or pasted into this session.
19
20
 
20
21
  ---
@@ -25,14 +26,14 @@ session started after it, so the session that finished JS0 cannot run this runbo
25
26
  Read this runbook's revision out of the HTML comment at the top of the file and tell me what it is, so the run is pinned to a known version of the kit. This task drives the **substrate modeler** skill — confirm it is invocable before you start.
26
27
 
27
28
  **1 · Scaffold a project.**
28
- Run `jitx project layout init`, then set up the project environment inside it:
29
+ Create a new project directory (copy the CSV into it, or paste the CSV into this session), run `jitx project layout init` **in it**, then set up the project environment inside it:
29
30
 
30
31
  ```bash
31
32
  # macOS / Linux
32
33
  python3 -m venv .venv && source .venv/bin/activate
33
34
 
34
35
  # Windows (PowerShell)
35
- py -3.12 -m venv .venv; .\.venv\Scripts\Activate.ps1
36
+ $env:PYTHONUTF8 = "1"; py -3 -m venv .venv; .\.venv\Scripts\Activate.ps1
36
37
  ```
37
38
 
38
39
  ```bash
@@ -69,10 +70,12 @@ A good result is: `pyright` reports zero errors, `pytest` is green with every as
69
70
  **8 · [HUMAN] Close the loop — re-issue the report.**
70
71
  Now show me the substrate regenerates from the report. **Invite me to change the CSV** — suggest I say: *"the fab came back on the through-hole again — 0.400 mm finished hole this time; re-issue the report and tell me what moved."* **Wait for me to ask.**
71
72
 
72
- Edit the CSV only with values I give you — both unit columns for the hole, the derived columns on the same row, a Rev C history line, and the `DOCUMENT` fields the skill's re-issue rule names. Per that rule, re-derive the arithmetic over the changed row and re-run the step-5 hand checks. `Depth_mm` does **not** move — it is set by the layer span, not the hole — so the new ratio is the same depth over the new hole. Then update `board.py`, rebuild, and report before → after — including what did **not** move: no dielectric changed, so no impedance row is touched and every trace width still points at its CSV row.
73
+ Edit the CSV only with values I give you — both unit columns for the hole, the derived columns on the same row, a Rev C history line, and the `DOCUMENT` fields the skill's re-issue rule names. Per that rule, re-derive the arithmetic over the changed row and re-run the step-5 hand checks. `Depth_mm` does **not** move — it is set by the layer span, not the hole — so the new ratio is the same depth over the new hole. Keep the CSV's filename — the revision lives in its `DOCUMENT` rows, not the name — and keep every edited column at the precision it already prints (`0.350` → `0.400`, `13.78` → `15.75`). Then update `board.py`, rebuild, and report before → after — including what did **not** move: no dielectric changed, so no impedance row is touched and every trace width still points at its CSV row.
73
74
 
74
75
  **If I ask for a dielectric change instead, stop.** A dielectric change re-solves the controlled-impedance line widths, and that solve belongs to the fab — the CSV carries its result, not the model that produced it. Report the affected trace widths as blocked pending re-solved impedance rows; do not estimate them, and do not carry the old widths forward as if they still held. If I supply re-solved rows, carry them through and report before → after for every changed width.
75
76
 
77
+ If the rebuild ends in `status: error` with `EOF when reading a line`, the runtime asked *"Significant changes detected… Do you want to continue? [Y/n]"* on a stdin it does not have under `--background` — there is no flag to pre-answer it, and piping `y` into `jitx build` does not reach it. Tell me: I stop the background runtime and run `jitx runtime start` in my own terminal, answer the prompt there, and you rebuild.
78
+
76
79
  Then close this step the way step 7 closes: `pyright`, `pytest`, a `jitx build` of the design that binds the substrate, and **`jitx-code-review`**. The code and tests you wrote here have not been through that gate — step 7's review went stale the moment you edited anything.
77
80
 
78
81
  ---
@@ -1,5 +1,5 @@
1
1
  <!--
2
- JITX Parametric Component Families Runbook (JS1 · Part 2) · rev 1.3 · 2026-08-31
2
+ JITX Parametric Component Families Runbook (JS1 · Part 2) · rev 1.4 · 2026-09-08
3
3
  Paste this file into your AI coding agent (Claude Code, Codex / GPT, or Devin), or upload it,
4
4
  and tell the agent to follow it. Complete the JS0 Setup Runbook first.
5
5
  START A NEW AGENT SESSION before you begin — a skills install only takes effect in a session
@@ -16,6 +16,7 @@ drives a skill.
16
16
  **Assumptions / prerequisites**
17
17
 
18
18
  - Python 3.12+ and `git` are available; the agent can run shell commands and fetch PDFs.
19
+ - The `jitx` library your project resolves should sit on the same release line as the CLI — if pip lands a different line, say so rather than silently proceeding.
19
20
  - `pip install pymupdf` is available for datasheet page extraction (the component-modeler skill uses it).
20
21
 
21
22
  ---
@@ -96,7 +97,7 @@ Create a new project directory and run `jitx project layout init` (seeds a two-r
96
97
  python3 -m venv .venv && source .venv/bin/activate
97
98
 
98
99
  # Windows (PowerShell)
99
- py -3.12 -m venv .venv; .\.venv\Scripts\Activate.ps1
100
+ $env:PYTHONUTF8 = "1"; py -3 -m venv .venv; .\.venv\Scripts\Activate.ps1
100
101
  ```
101
102
 
102
103
  ```bash
@@ -114,15 +115,15 @@ Download all four manufacturer datasheets into `.context/` (gitignored — **lin
114
115
  - **Yageo RC_L** — https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L (the RC_L series datasheet, all sizes 0075–2512).
115
116
  - **Panasonic ERJ** — https://industrial.panasonic.com/cdbs/www-data/pdf/RDA0000/AOA0000C301.pdf
116
117
  - **Vishay CRCW** — https://www.vishay.com/docs/20035/dcrcwe3.pdf
117
- - **Samsung CL (MLCC)** — the Samsung Electro-Mechanics MLCC catalog PDF: https://product.samsungsem.com/resources/file/product-catalog/MLCC_2512.pdf (the filename is dated per revision — if it has moved, get the newest MLCC catalog from https://product.samsungsem.com/product-catalog.do). It contains the part-numbering scheme, case-size dimension tables, and the dielectric/voltage lineup.
118
+ - **Samsung CL (MLCC)** — the Samsung Electro-Mechanics MLCC catalog PDF: https://product.samsungsem.com/resources/file/product-catalog/MLCC_2512.pdf (the filename is dated per revision — if it has moved, get the newest MLCC catalog from https://product.samsungsem.com/product-catalog.do). It contains the part-numbering scheme and the dielectric/voltage lineup; step 7 names what it does **not** contain.
118
119
 
119
120
  Per the skill's **"Verify the download is a datasheet"**: these four URLs are canonical, so if one doesn't answer, say whether you hit an egress problem or a moved document, and tell me which URL you ended up using.
120
121
 
121
122
  **3 · Family 1 — Yageo RC_L.**
122
- Drive the component-modeler skill with the Yageo datasheet to build `yageo_rc.py`, following its **Parameterized Component Families** and **Two-Terminal Chip Components** sections. Values encode in Yageo's RKM style (`100K`). Keep this family **self-contained in one file — no shared helpers yet**. Write `tests/test_yageo_rc.py` per the skill's **"Verifying a component with tests"**, cross-checking the datasheet's own ordering example **`RC0402JR-07100KL`**. Verify: `pyright` → `pytest` → `jitx build <non-test design target>`. Commit when green.
123
+ Drive the component-modeler skill with the Yageo datasheet to build `yageo_rc.py`, following its **Parameterized Component Families** and **Two-Terminal Chip Components** sections. Values encode in Yageo's RKM style (`100K`). Keep this family **self-contained in one file — no shared helpers yet**. Write `tests/test_yageo_rc.py` per the skill's **"Verifying a component with tests"**, cross-checking the datasheet's own ordering example **`RC0402JR-07100KL`**. Table-driven checks go in `self.subTest(...)` — pytest's `parametrize` does not apply to `unittest`-style `TestCase` methods, and `jitx.test.TestCase` is one. Verify: `pyright` → `pytest` → `jitx build <non-test design target>`. Commit when green.
123
124
 
124
125
  **4 · [HUMAN] Verify Family 1 together.**
125
- Stop and walk me through the family against the datasheet before replicating the pattern. Show me: (a) two or three transcribed dimensions side-by-side with the datasheet table, **including which of the two printed termination bands you used and why**; (b) the encoder reproducing the ordering-example MPN and a decade-carry case (`9999 → "10K"`); (c) a fail-fast rejection listing the valid options — run this demo **inside the instantiation context**, since a plain script raises nothing; (d) how each vendor size label maps to the generator's size key by body L×W — including the label mismatch (Yageo `0075` → `009005`); (e) the skill's filled **Component completeness check** block. **Wait for my approval** before continuing.
126
+ Stop and walk me through the family against the datasheet before replicating the pattern. Show me: (a) two or three transcribed dimensions side-by-side with the datasheet table, **including which of the two printed termination bands you used and why**; (b) the encoder reproducing the ordering-example MPN and a decade-carry case (`9999 → "10K"`); (c) a fail-fast rejection listing the valid options — run this demo **inside the instantiation context**, since a plain script raises nothing; (d) how each vendor size label maps to the generator's size key by body L×W — three naming systems meet here: the vendor's own label, the metric code, and the EIA imperial code the generator keys on. Yageo's `0075` is a 0.30 × 0.15 mm body, metric `03015`, imperial (and JITX key) `009005`; its `0100` is 0.40 × 0.20 mm, metric `0402`, imperial `01005`; (e) the skill's filled **Component completeness check** block. **Wait for my approval** before continuing.
126
127
 
127
128
  **5 · Family 2 — Panasonic ERJ.**
128
129
  Build `panasonic_erj.py` from the Panasonic datasheet: 3-digit EIA value code (`103`), its own tables and MPN f-string. This is the second consumer, so per the skill's **"Shared helpers — extract at the second family"**, extract them now into `chip_resistor.py` and refactor Family 1 onto them — Family 1's unchanged tests passing proves the refactor safe. Write `tests/test_panasonic_erj.py`, cross-checking **`ERJ3GEYJ102V`**. Verify: `pyright` → `pytest` (all families) → `jitx build <non-test design target>`. Commit when green.
@@ -139,7 +140,7 @@ Create a small combined `SampleDesign` that instantiates one part from **each of
139
140
  A good result is: `pyright` reports zero errors and no suppressions, the full `pytest` suite is green including every family's datasheet cross-check, `jitx build <non-test design target>` completes on the combined design, `jitx-code-review` returns no unresolved findings, and each family has its **Component completeness check** block filled in, written next to the code.
140
141
 
141
142
  **9 · [HUMAN] Close the loop — request a part.**
142
- The library is done; now show me what it's for. **Invite me to ask for an arbitrary part** — suggest I say: *"give me a 49.9 kΩ 0402 1% Yageo and a 100 nF X7R 0603 50 V Samsung CL."* **Wait for me to ask.** When I do, instantiate the requested parts from the family classes in the combined design, rebuild, and show me the schematic/board plus the **generated MPNs**, so I can spot-check them against the datasheets' part-numbering schemes.
143
+ The library is done; now show me what it's for. **Invite me to ask for an arbitrary part** — suggest I say: *"give me a 49.9 kΩ 0402 1% Yageo and a 100 nF X7R 0603 50 V Samsung CL."* **Wait for me to ask.** When I do, instantiate the requested parts from the family classes in the combined design, rebuild, and show me the schematic/board — launch `jitx ui open` in the background, it blocks while its window is open (JS0 step 5 explains) — plus the **generated MPNs**, so I can spot-check them against the datasheets' part-numbering schemes.
143
144
 
144
145
  This step writes code, so it goes through step 8's gate like every other step — finish with the full verification block (`pyright` → `pytest` → `jitx build <non-test design target>` → `jitx-code-review`). Don't let the last code written be the only code that skipped the review. Print the BOM as well as the MPNs: value labels are the one thing none of those four commands checks.
145
146
 
@@ -1,4 +1,4 @@
1
- <!-- Versal FPGA from the Vendor Pin File — Reference Companion (JS1 · Part 3) · rev 1.1 · 2026-08-27 -->
1
+ <!-- Versal FPGA from the Vendor Pin File — Reference Companion (JS1 · Part 3) · rev 1.2 · 2026-09-08 -->
2
2
 
3
3
  # Versal FPGA from the Vendor Pin File — Reference Companion (JS1 · Part 3)
4
4
 
@@ -53,8 +53,9 @@ Reference solution: the `jitxexamples` package, module
53
53
  | **Total** | **1369** |
54
54
 
55
55
  Six GTM quads, each 4 × (RXP/RXN/TXP/TXN) lanes + 2 × REFCLK pairs; the quad-column bias pins
56
- (`GTM_RREF_*`, `GTM_AVTTRCAL_*`, and the GTY equivalents) are single balls that take one external
57
- precision resistor each — the circuit wrapper exposes them as pass-through ports.
56
+ (`GTM_AVTTRCAL_L`, `GTM_RREF_L`, `GTM_AVTTRCAL_RN`, `GTM_RREF_RN`, `GTY_AVTTRCAL_RS`,
57
+ `GTY_RREF_RS`) are single balls that take one external precision resistor each — the circuit
58
+ wrapper exposes them as pass-through ports.
58
59
 
59
60
  ## Two traps the runbook makes you catch
60
61
 
@@ -74,7 +75,7 @@ precision resistor each — the circuit wrapper exposes them as pass-through por
74
75
 
75
76
  - Generator reconciliation: parsed rows = file footer = **1369**, unique balls, full grid; the
76
77
  committed module regenerates **byte-identically** (`--check`).
77
- - 17 tests + 74 subtests pass offline on the jitx 4.4 line, including ~10 hand-read
78
+ - 19 tests + 198 subtests pass offline on the jitx 4.4 line, including ~10 hand-read
78
79
  ball spot-checks spanning the grid corners and every bank type, symbol coverage (every port in
79
80
  exactly one box), and mapping bijectivity. Both non-test designs `jitx build` with `status: ok`.
80
81
  - Every one of the 1369 balls was **independently re-checked against the AMD file** by a
@@ -1,5 +1,5 @@
1
1
  <!--
2
- JITX Versal FPGA from the Vendor Pin File Runbook (JS1 · Part 3) · rev 1.3 · 2026-08-31
2
+ JITX Versal FPGA from the Vendor Pin File Runbook (JS1 · Part 3) · rev 1.4 · 2026-09-08
3
3
  Paste this file into your AI coding agent (Claude Code, Codex / GPT, or Devin), or upload it,
4
4
  and tell the agent to follow it. Complete the JS0 Setup Runbook first.
5
5
  START A NEW AGENT SESSION before you begin — a skills install only takes effect in a session
@@ -24,6 +24,8 @@ is marked **[HUMAN]**, stop and wait for me — do not proceed until I confirm.
24
24
  > `pip install jitxexamples`, then the module
25
25
  > `jitxexamples.jumpstart_kits.js1_stackup_components.versal_fpga` — also readable on
26
26
  > [GitHub](https://github.com/JITx-Inc/jitx-examples/tree/main/src/jitxexamples/jumpstart_kits/js1_stackup_components/versal_fpga).
27
+ > (The scaffold seeds `jitxexamples-components`, which shares the namespace, so `import jitxexamples`
28
+ > succeeding is not proof it is installed — the test is `import jitxexamples.jumpstart_kits`.)
27
29
  > Expect roughly 2–3 hours end to end, most of it agent-autonomous.
28
30
 
29
31
  **Assumptions / prerequisites**
@@ -115,7 +117,7 @@ environment inside it:
115
117
  python3 -m venv .venv && source .venv/bin/activate
116
118
 
117
119
  # Windows (PowerShell)
118
- py -3.12 -m venv .venv; .\.venv\Scripts\Activate.ps1
120
+ $env:PYTHONUTF8 = "1"; py -3 -m venv .venv; .\.venv\Scripts\Activate.ps1
119
121
  ```
120
122
 
121
123
  ```bash
@@ -209,7 +211,9 @@ comment, coordinate tables under `# fmt: off`, the structural `gtm_quad_pins()`
209
211
  **Mark the 60 NC balls `no_connect()`** — they are open per AMD, and an ordinary `Port()` makes that
210
212
  indistinguishable from a board designer forgetting to wire them. Output must be deterministic and
211
213
  `ruff format`-stable per the skill's rule for emitted collections, with a `--check` mode that
212
- regenerates and diffs. Run the generator; commit the generated module.
214
+ regenerates and diffs. Read the pin file and write the module with explicit `encoding="utf-8"` and
215
+ `newline="\n"` — the platform defaults (`cp1252`, CRLF on Windows) are what make `--check` drift
216
+ between machines. Run the generator; commit the generated module.
213
217
 
214
218
  **7 · Build the land pattern — read the drawing, then the fine print.**
215
219
  From the figure captioned **"Package Dimensions for NFVI1369"** take body 35×35 mm, height
@@ -217,8 +221,11 @@ From the figure captioned **"Package Dimensions for NFVI1369"** take body 35×35
217
221
  Øb = 0.50/0.64/0.70 mm, but the JITX BGA generator's `ball_diameter` argument sets the **copper land
218
222
  diameter** of the PCB pad. Open the jitxlib BGA generator source and confirm what the parameter
219
223
  drives, then take the land from the table captioned **"BGA Package Design Rules"** (0.92 mm pitch →
220
- **0.51 mm** max PCB solder land, NSMD). State in a comment where each number came from, caption
221
- first. Build `landpattern.py` with a `VersalBGA(BGA)` subclass adding the public `get_pad(row,
224
+ **0.51 mm** max PCB solder land, NSMD). The same row gives a **0.61 mm** solder-mask opening: decide
225
+ whether you set it per pad or let the substrate's registration rules size the mask at build time,
226
+ and record which in the same comment — either is defensible, an unrecorded default is not. State
227
+ in a comment where each number came from, caption first. Build `landpattern.py` with a
228
+ `VersalBGA(BGA)` subclass adding the public `get_pad(row,
222
229
  column)` adapter per the skill's BGA notes — both arguments zero-indexed, matching the coordinates
223
230
  the generated module carries, so ball A1 is `get_pad(0, 0)` and the framework's 1-based column
224
231
  offset lives inside the adapter rather than at every call site.
@@ -245,11 +252,14 @@ Show me, side by side with the pinout file: the corners **A1** and **AU37** (bot
245
252
  per bank type (a GTM lane, a GTY refclk, a PMC_MIO, an LPD_MIO, an XPIO pin); both sysmon pairs
246
253
  (VP/VN_500, VREFP/VREFN_500); and two GNDs from opposite corners — each as
247
254
  ball → `(row, col)` → port → pad. Also show the geometry cross-check: the A1↔AU37 pad centers
248
- must be 36 × 0.92 = **33.12 mm** apart on both axes (the drawing's D1/E1). **Wait for my approval.**
255
+ must be 36 × 0.92 = **33.12 mm** apart on both axes (the drawing's D1/E1) — and **signed**: read each
256
+ pad's `transform` and show A1 and AU37 at opposite corners, because the unsigned distance alone
257
+ passes a mirrored grid. Put that signed check in the tests too. **Wait for my approval.**
249
258
 
250
259
  **11 · Wrap the circuit.**
251
- Drive the circuit-builder skill. Create `bundles.py` (`GTMQuad`: 4 × `LanePair` + 2 × REFCLK
252
- `DiffPair`) and `circuit.py` (`XCVP1002Circuit`): one `Power()` port per supply rail from your
260
+ Drive the circuit-builder skill. Create `bundles.py` (`GTMQuad`: 4 × `jitx.common.LanePair` —
261
+ upper-case `TX`/`RX` sub-ports with lower-case `p`/`n` inside — + 2 × REFCLK `DiffPair`) and
262
+ `circuit.py` (`XCVP1002Circuit`): one `Power()` port per supply rail from your
253
263
  step-4 inventory — **no rail invented, none dropped**; a `rail_ties()` roster method; three ground
254
264
  domains (main GND takes all 689 GND + 2 RSVDGND + every main rail's `Vn`; `GND_SMON` and
255
265
  `GND_SENSE` take only their dedicated ball + their rail's `Vn`); sysmon inputs and the six GT
@@ -263,9 +273,10 @@ rules. Where this part instantiates them:
263
273
  so they land as scalar ports rather than rail lists. Two of the four carry the returns that
264
274
  *define* `GND_SMON` and `GND_SENSE`, so a roster built by walking the rail lists both undercounts
265
275
  and silently collapses the three-ground requirement.
266
- - **The six GT bias pins live in banks 109, 203 and 105** — 109 carries its pair and **no lanes at
267
- all**. They serve whole supply groups, so keep them out of `GTMQuad`: model them per-quad and four
268
- of the six quads have none.
276
+ - **The six GT bias pins live in banks 109, 203 and 105** — `GTM_AVTTRCAL_L`, `GTM_RREF_L`,
277
+ `GTM_AVTTRCAL_RN`, `GTM_RREF_RN`, `GTY_AVTTRCAL_RS`, `GTY_RREF_RS`; 109 carries its pair and **no
278
+ lanes at all**. They serve whole supply groups, so keep them out of `GTMQuad`: model them per-quad
279
+ and four of the six quads have none.
269
280
  - **The `_L` / `_RS` group tags come from the bank diagram**, not the pin file — including which
270
281
  groups have no bonded quad in this package.
271
282
 
@@ -277,16 +288,19 @@ named net colliding with a public port name fails only in the full runtime build
277
288
  already in use"); `jitx build --dry` cannot see it.
278
289
 
279
290
  **12 · Verify the circuit.**
280
- Extend the tests (rail roster + sizes, ground-domain separation, 6 quads × 20 topology links,
281
- circuit design translates), then `pyright` → `pytest` → `jitx build <non-test circuit design target>` →
291
+ Extend the tests (rail roster + sizes, ground-domain separation, 6 quads × 20 topology links **and**,
292
+ for at least one quad, that each link's two endpoints are the expected bundle sub-port and component
293
+ ball — a count alone passes a lane- or polarity-swapped wiring; circuit design translates), then
294
+ `pyright` → `pytest` → `jitx build <non-test circuit design target>` →
282
295
  `jitx-code-review`. Commit when green.
283
296
 
284
297
  **13 · [HUMAN] Close the loop.**
285
298
  The wrapper is what a board design consumes; show me. **Invite me to ask for something** —
286
299
  suggest I say: *"give me GTM quad 205 as a 4-lane bundle and tell me which power rails and bias
287
300
  pins it needs."* **Wait for me to ask.** Answer from the built circuit (bundle port, rail ties,
288
- bias pass-throughs), then open the schematic viewer (`jitx ui open --schematic`) on the bank-205
289
- page so I can see the quad.
301
+ bias pass-throughs), then open the schematic viewer (`jitx ui open --schematic`, in the background
302
+ — it blocks while its window is open, see JS0 step 5) and tell me the bank-205 page to look at: the
303
+ CLI opens the design, not a page, so I navigate there in the viewer.
290
304
 
291
305
  **This answer goes through a gate like every other step.** State which document each claim comes
292
306
  from; anything not derivable from the built design or the step-2 documents, say so rather than
@@ -37,7 +37,7 @@ add `GTMQuad` (4 lanes + 2 refclks) and `XCVP1002Circuit`: 31 `Power` rails, thr
37
37
  (GND / GND_SMON / GND_SENSE), and six GTM quad bundles wired through the generated pin groupings.
38
38
 
39
39
  **How we know it's right.** Reconciliation runs before any code: parsed rows = file footer = 1,369,
40
- unique balls, full 37×37 grid. Then 17 tests and 74 subtests on jitx 4.4 — hand-read ball
40
+ unique balls, full 37×37 grid. Then 19 tests and 198 subtests on jitx 4.4 — hand-read ball
41
41
  spot-checks across grid corners and every bank type, symbol coverage, mapping bijectivity, circuit
42
42
  rail roster. Both designs, the component viewer and the wrapped circuit, build `status: ok` against
43
43
  the runtime. An independent 13-agent review re-checked all 1,369 balls against the AMD file with
@@ -123,7 +123,7 @@ that don't bear on this file's own choices.
123
123
  mapping``. The mapping form accepts ``None`` values at construction time,
124
124
  but they are **translation-fatal**: ``jitx._translate.routing`` assigns
125
125
  ``desired_width`` into a protobuf float with no ``None`` guard (verified on
126
- 4.2.2 and 4.4.0rc2). The failure is latent in this kit because routing
126
+ 4.2.2 and 4.4.0). The failure is latent in this kit because routing
127
127
  structures only translate when a net, topology or rule applies them, and
128
128
  ``main.py``'s smoke design has an empty circuit — it would surface in the
129
129
  first consumer design that uses one. So this file carries the planes with
@@ -64,8 +64,10 @@ def _dims(
64
64
 
65
65
 
66
66
  # Yageo size label -> JITX SMT_CHIP_DEFS case key, where the two differ. Most
67
- # sizes use their imperial label directly; the ultra-tiny 0075/0100 are keyed in
68
- # the generator by their metric body size (0.30x0.15 mm, 0.40x0.20 mm).
67
+ # Yageo labels are the EIA imperial code the generator keys on; the ultra-tiny
68
+ # 0075/0100 are Yageo's own labels, so they map by body size to that code:
69
+ # 0075 = 0.30x0.15 mm = metric 03015 = imperial 009005, and
70
+ # 0100 = 0.40x0.20 mm = metric 0402 = imperial 01005.
69
71
  _SMT_KEY: dict[str, str] = {"0075": "009005", "0100": "01005"}
70
72
 
71
73
  # Dimensions (mm) from datasheet Table 1: _dims(L, +/-, W, +/-, H, +/-, l2, +/-)
@@ -637,14 +637,14 @@ def main(argv: list[str] | None = None) -> int:
637
637
  help="regenerate and diff against --out; exit 1 on drift",
638
638
  )
639
639
  args = parser.parse_args(argv)
640
- text = args.pinout_file.read_text()
640
+ text = args.pinout_file.read_text(encoding="utf-8")
641
641
  model = classify(parse_pinout(text, args.pinout_file.name))
642
642
  if args.report:
643
643
  print(inventory_report(model))
644
644
  return 0
645
645
  emitted = emit_module(model)
646
646
  if args.check:
647
- committed = args.out.read_text()
647
+ committed = args.out.read_text(encoding="utf-8")
648
648
  if committed == emitted:
649
649
  print(f"OK: {args.out} matches regeneration")
650
650
  return 0
@@ -653,7 +653,7 @@ def main(argv: list[str] | None = None) -> int:
653
653
  )
654
654
  sys.stdout.writelines(line + "\n" for line in list(diff)[:60])
655
655
  return 1
656
- args.out.write_text(emitted)
656
+ args.out.write_text(emitted, encoding="utf-8", newline="\n")
657
657
  counts = f"{len(model.uniques)} unique ports, {len(model.rails)} rails"
658
658
  print(f"wrote {args.out} ({counts}, {model.pinout.total_from_footer} balls)")
659
659
  return 0