firestarter 3.2.1b1__tar.gz → 3.2.3__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 (220) hide show
  1. {firestarter-3.2.1b1/firestarter.egg-info → firestarter-3.2.3}/PKG-INFO +2 -1
  2. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/_version.py +3 -3
  3. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/chip_resolver.py +44 -1
  4. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/cli_handlers.py +41 -11
  5. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/data/chip_database.json +29 -29
  6. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/data/pinouts.json +26 -3
  7. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/database.py +156 -37
  8. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/diagnostic_report.py +4 -4
  9. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/eprom_info.py +35 -7
  10. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/eprom_operations.py +6 -6
  11. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/exceptions.py +6 -0
  12. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/firmware.py +3 -2
  13. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/ic_layout.py +12 -3
  14. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/jumper_table.py +21 -0
  15. firestarter-3.2.3/firestarter/timestamps.py +83 -0
  16. {firestarter-3.2.1b1 → firestarter-3.2.3/firestarter.egg-info}/PKG-INFO +2 -1
  17. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/SOURCES.txt +4 -9
  18. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/requires.txt +1 -0
  19. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/scm_file_list.json +5 -9
  20. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/scm_version.json +2 -2
  21. {firestarter-3.2.1b1 → firestarter-3.2.3}/pyproject.toml +1 -0
  22. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/__snapshots__/test_characterization.ambr +29 -28
  23. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/conftest.py +35 -0
  24. firestarter-3.2.1b1/tests/golden/wire_dict_baseline.json → firestarter-3.2.3/tests/golden/wire_dict.json +276 -195
  25. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/plan_corpus.py +11 -1
  26. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_pinout_fork.py +40 -0
  27. firestarter-3.2.3/tests/test_chip_name_resolution.py +199 -0
  28. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_resolver.py +2 -1
  29. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_derive_plan_no_drop_sweep.py +14 -22
  30. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_derive_plan_structural_sentinel.py +20 -34
  31. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_devtest_firmware_error_propagation.py +11 -4
  32. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_eprom_database.py +58 -1
  33. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_erase_flag_invariants.py +20 -30
  34. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_firmware_install.py +4 -2
  35. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_hardware.py +10 -2
  36. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_ic_layout.py +36 -0
  37. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_jumper_table.py +3 -1
  38. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_page_size_invariants.py +22 -44
  39. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_probe_spurious_setup_ack.py +3 -0
  40. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protocol_not_implemented_production_path.py +4 -1
  41. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_sdp_db_invariant.py +22 -62
  42. firestarter-3.2.3/tests/test_timestamps.py +87 -0
  43. firestarter-3.2.3/tests/test_wire_dict_equivalence.py +177 -0
  44. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_blank_guard_pinning.py +10 -6
  45. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_149.json +0 -65
  46. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_153.json +0 -265
  47. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_182.json +0 -219
  48. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_194.json +0 -86
  49. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_197.json +0 -20
  50. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_198.json +0 -17
  51. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_199.json +0 -14
  52. firestarter-3.2.1b1/tests/golden/wire_dict_expected_deltas_dip24_2816.json +0 -91
  53. firestarter-3.2.1b1/tests/test_wire_dict_equivalence.py +0 -821
  54. {firestarter-3.2.1b1 → firestarter-3.2.3}/LICENSE +0 -0
  55. {firestarter-3.2.1b1 → firestarter-3.2.3}/MANIFEST.in +0 -0
  56. {firestarter-3.2.1b1 → firestarter-3.2.3}/README.md +0 -0
  57. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/__init__.py +0 -0
  58. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/address_parser.py +0 -0
  59. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/avr_tool.py +0 -0
  60. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/channel.py +0 -0
  61. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/chip_test.py +0 -0
  62. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/codec.py +0 -0
  63. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/compare.py +0 -0
  64. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/config.py +0 -0
  65. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/constants.py +0 -0
  66. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/dip24_2816_erase_gate.py +0 -0
  67. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/erase_support.py +0 -0
  68. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/flash4_erase_gate.py +0 -0
  69. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/frame_parser.py +0 -0
  70. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/fw_release_gate.py +0 -0
  71. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/hardware.py +0 -0
  72. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/jp5_gate.py +0 -0
  73. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/lock_status.py +0 -0
  74. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/log_capture.py +0 -0
  75. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/logging_utils.py +0 -0
  76. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/main.py +0 -0
  77. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/messages.py +0 -0
  78. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/page_size_gate.py +0 -0
  79. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/protection_readability.py +0 -0
  80. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/py32_dfu.py +0 -0
  81. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/sdp_capability.py +0 -0
  82. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/sdp_honesty.py +0 -0
  83. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/serial_comm.py +0 -0
  84. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/submit.py +0 -0
  85. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/transport_counters.py +0 -0
  86. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/utils.py +0 -0
  87. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/vpp_display.py +0 -0
  88. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter/write_blank_guard.py +0 -0
  89. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/dependency_links.txt +0 -0
  90. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/entry_points.txt +0 -0
  91. {firestarter-3.2.1b1 → firestarter-3.2.3}/firestarter.egg-info/top_level.txt +0 -0
  92. {firestarter-3.2.1b1 → firestarter-3.2.3}/setup.cfg +0 -0
  93. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/__init__.py +0 -0
  94. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fake_chip.py +0 -0
  95. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/part_number_delta.json +0 -0
  96. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/report_shapes.py +0 -0
  97. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/at28c256-full-all-ok-sdp.json +0 -0
  98. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/attr01-status-axis-transport-fault.json +0 -0
  99. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh20-at28c256-fail.json +0 -0
  100. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh23-w27e257-fail.json +0 -0
  101. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh28-m27c512-fail.json +0 -0
  102. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/gh47-sst27sf512-pass.json +0 -0
  103. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-all-ok.json +0 -0
  104. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-blank-check-bad.json +0 -0
  105. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-canonical-name.json +0 -0
  106. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-comma-joined-name.json +0 -0
  107. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/m27c512-full-runs-1.json +0 -0
  108. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/prune03-synthesized-fingerprint-match.json +0 -0
  109. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-full-all-ok.json +0 -0
  110. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-six-step-readback-gated.json +0 -0
  111. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/sst27sf512-six-step.json +0 -0
  112. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/synthetic-arm4-empty-results.json +0 -0
  113. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/synthetic-arm4-no-ok.json +0 -0
  114. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/uv-slot-write-pass.json +0 -0
  115. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/reports/w27e257-full-all-ok.json +0 -0
  116. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/shape_ids.json +0 -0
  117. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/fixtures/synthetic_nonzero_chip_id.py +0 -0
  118. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/golden/build_db_part_specific_constants.json +0 -0
  119. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/golden/chip_database_field_inventory.json +0 -0
  120. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_address_parser.py +0 -0
  121. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_b15_page_size_corroboration.py +0 -0
  122. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_blast_radius_invariance.py +0 -0
  123. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_boot_block_hint.py +0 -0
  124. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_budget_failure_render.py +0 -0
  125. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_bug_characterization.py +0 -0
  126. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_constant_census.py +0 -0
  127. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_inclusion.py +0 -0
  128. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_build_db_interpret_timing.py +0 -0
  129. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_canonical_part_number.py +0 -0
  130. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_characterization.py +0 -0
  131. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_database_field_inventory.py +0 -0
  132. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test.py +0 -0
  133. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_blank_check_order.py +0 -0
  134. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_cycle.py +0 -0
  135. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_sdp_leg.py +0 -0
  136. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_timing.py +0 -0
  137. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_chip_test_uv_slot_write.py +0 -0
  138. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_cli_handlers.py +0 -0
  139. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_click_group_gate_hook.py +0 -0
  140. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_cobs.py +0 -0
  141. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_codec.py +0 -0
  142. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_codec_format_message.py +0 -0
  143. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_compare.py +0 -0
  144. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_config.py +0 -0
  145. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_config_band_refusal.py +0 -0
  146. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_connect_cost_harness.py +0 -0
  147. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_consistency_check.py +0 -0
  148. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_coverage_floor_v18.py +0 -0
  149. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_database_conversion.py +0 -0
  150. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_datasheet_overrides.py +0 -0
  151. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_decoder.py +0 -0
  152. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dev_group_channel_gating.py +0 -0
  153. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dev_test_cmd.py +0 -0
  154. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dev_tools_channel_gate.py +0 -0
  155. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dfu_opcode_anchors.py +0 -0
  156. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_diagnostic_report.py +0 -0
  157. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_dip24_2816_erase_gate.py +0 -0
  158. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_endpoint_constants.py +0 -0
  159. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_eprom_info.py +0 -0
  160. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_eprom_operations.py +0 -0
  161. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_erase_blank_step_nonregression.py +0 -0
  162. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_error_code_seam.py +0 -0
  163. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_even_block.py +0 -0
  164. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_extra_chips_supplement.py +0 -0
  165. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_flash4_erase_gate.py +0 -0
  166. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_list_failure_vs_empty.py +0 -0
  167. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_port_targeting_and_blind_install.py +0 -0
  168. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_release_gate.py +0 -0
  169. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_update_dead_endpoint.py +0 -0
  170. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_update_path_gate.py +0 -0
  171. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fw_version_guard.py +0 -0
  172. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_fwguard.py +0 -0
  173. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_hw_revision_gate.py +0 -0
  174. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_info_vpp_and_erase.py +0 -0
  175. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_jp5_gate.py +0 -0
  176. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_lock_status_class_partition.py +0 -0
  177. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_lock_status_cli.py +0 -0
  178. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_lock_status_wire.py +0 -0
  179. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_log_capture.py +0 -0
  180. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_logging_utils.py +0 -0
  181. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_matrix_artifact.py +0 -0
  182. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_page_size_alignment_refusal.py +0 -0
  183. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_page_size_write_refusal.py +0 -0
  184. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_parse_devtest_issue.py +0 -0
  185. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_programming_vcc_census.py +0 -0
  186. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protect_flags_doc_measurements.py +0 -0
  187. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protection_resolution.py +0 -0
  188. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protection_status_catalog.py +0 -0
  189. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protection_table_citations.py +0 -0
  190. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_protocol_not_implemented.py +0 -0
  191. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_provenance.py +0 -0
  192. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_pulse_us_override.py +0 -0
  193. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_channel_gating.py +0 -0
  194. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_dfu.py +0 -0
  195. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_flash_map_host.py +0 -0
  196. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_py32_pyusb_absent.py +0 -0
  197. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_pyusb_api_surface.py +0 -0
  198. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_sdp_capability.py +0 -0
  199. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_sdp_honesty.py +0 -0
  200. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_serial_characterization.py +0 -0
  201. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_serial_comm.py +0 -0
  202. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_session_lease.py +0 -0
  203. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_setup_refusals.py +0 -0
  204. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_submit.py +0 -0
  205. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_transport_counters.py +0 -0
  206. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_utils.py +0 -0
  207. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_uv_mask.py +0 -0
  208. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_validate_family_cmd.py +0 -0
  209. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_validate_oracle.py +0 -0
  210. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_validated_parts_regression_surface.py +0 -0
  211. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_vcc_margin_rail.py +0 -0
  212. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_vpp_decode_table.py +0 -0
  213. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_vpp_rail_classification.py +0 -0
  214. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_blank_guard.py +0 -0
  215. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_guard_port_pinning.py +0 -0
  216. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_progress.py +0 -0
  217. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_response_budget.py +0 -0
  218. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_skip_erase_0x0d.py +0 -0
  219. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_skip_sdp_unlock.py +0 -0
  220. {firestarter-3.2.1b1 → firestarter-3.2.3}/tests/test_write_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: firestarter
3
- Version: 3.2.1b1
3
+ Version: 3.2.3
4
4
  Summary: EPROM programmer software for the Relatively Universal ROM Programmer
5
5
  Author-email: Henrik Olsson <henols@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/henols/firestarter_app
@@ -37,6 +37,7 @@ Requires-Dist: syrupy<7,>=5.0; extra == "test"
37
37
  Requires-Dist: ruff>=0.15.14; extra == "test"
38
38
  Requires-Dist: mypy<3,>=2.1.0; extra == "test"
39
39
  Requires-Dist: pytest-cov>=7.1.0; extra == "test"
40
+ Requires-Dist: pytest-xdist>=3.6; extra == "test"
40
41
  Requires-Dist: types-pyserial>=3.5.0.20260519; extra == "test"
41
42
  Dynamic: license-file
42
43
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '3.2.1b1'
22
- __version_tuple__ = version_tuple = (3, 2, 1, 'b1')
21
+ __version__ = version = '3.2.3'
22
+ __version_tuple__ = version_tuple = (3, 2, 3)
23
23
 
24
- __commit_id__ = commit_id = 'g98e2959'
24
+ __commit_id__ = commit_id = 'g660e8c4'
@@ -10,11 +10,50 @@ Single chokepoint between CLI dispatch and the EPROM database lookup/conversion.
10
10
  from typing import Any
11
11
 
12
12
  from firestarter.database import EpromDatabase
13
- from firestarter.exceptions import ChipNotFoundError, ChipNotImplementedError
13
+ from firestarter.exceptions import (
14
+ AmbiguousChipNameError,
15
+ ChipNotFoundError,
16
+ ChipNotImplementedError,
17
+ )
14
18
 
15
19
  _NON_ZERO_WIRE_FIELDS = ("memory-size", "pin-count", "vpp_mv")
16
20
 
17
21
 
22
+ def _qualified_choices(name: str, db: EpromDatabase) -> list[str]:
23
+ """The row `name` selects first, then each other row it selects that
24
+ programs differently, all as qualified names. Empty when one row, or rows
25
+ that program the same, are selected."""
26
+ alternatives = db.ambiguous_alternatives(name)
27
+ if not alternatives:
28
+ return []
29
+ raw_config, manufacturer = db.get_eprom_config(name)
30
+ return [db.qualified_chip_name(name, raw_config, manufacturer), *alternatives]
31
+
32
+
33
+ def refuse_if_ambiguous(name: str, db: EpromDatabase) -> None:
34
+ """Refuse a name that selects chips that program differently: guessing
35
+ one would drive the wrong VPP, algorithm or timing."""
36
+ choices = _qualified_choices(name, db)
37
+ if choices:
38
+ listed = ", ".join(f"'{c}'" for c in choices)
39
+ raise AmbiguousChipNameError(
40
+ f"'{name}' names chips that program differently. Name one: {listed}."
41
+ )
42
+
43
+
44
+ def describe_ambiguity(name: str, db: EpromDatabase) -> str | None:
45
+ """For display commands, which use the first row: the other rows `name`
46
+ selects, or None."""
47
+ choices = _qualified_choices(name, db)
48
+ if not choices:
49
+ return None
50
+ others = ", ".join(f"'{c}'" for c in choices[1:])
51
+ return (
52
+ f"'{name}' also names chips that program differently: {others}. "
53
+ f"This shows '{choices[0]}'."
54
+ )
55
+
56
+
18
57
  def resolve_chip(name: str, db: EpromDatabase | None = None) -> dict[str, Any]:
19
58
  """Resolve a chip name to its programmer-config dict.
20
59
 
@@ -26,6 +65,9 @@ def resolve_chip(name: str, db: EpromDatabase | None = None) -> dict[str, Any]:
26
65
  conversion (``convert_to_programmer`` returns ``{}``) are treated as the
27
66
  not-found condition.
28
67
 
68
+ Raises ``AmbiguousChipNameError`` (a ``ChipNotFoundError``) when the name
69
+ selects rows that program differently; the message names each of them.
70
+
29
71
  Raises ``ChipNotImplementedError`` when the chip exists in the database but
30
72
  its ``support_status`` is not ``"supported"`` (covers protocol-not-implemented,
31
73
  adapter-required, and vpp-exceeds-max). This guard fires BEFORE any wire dict
@@ -49,6 +91,7 @@ def resolve_chip(name: str, db: EpromDatabase | None = None) -> dict[str, Any]:
49
91
  # have a support_status, so raise ChipNotFoundError immediately.
50
92
  if raw_config is None:
51
93
  raise ChipNotFoundError(name)
94
+ refuse_if_ambiguous(name, db)
52
95
 
53
96
  # Support-status guard: refuse every program-capable operation
54
97
  # for non-supported chips BEFORE convert_to_programmer builds any wire dict.
@@ -4,7 +4,6 @@ This module is the production CLI surface; main.py re-exports `cli` as `main`
4
4
  for the console-script entry point.
5
5
  """
6
6
 
7
- import datetime
8
7
  import functools
9
8
  import hashlib
10
9
  import json
@@ -39,7 +38,11 @@ from firestarter.channel import (
39
38
  dev_command_gate_message,
40
39
  is_dev_tools_enabled,
41
40
  )
42
- from firestarter.chip_resolver import resolve_chip
41
+ from firestarter.chip_resolver import (
42
+ describe_ambiguity,
43
+ refuse_if_ambiguous,
44
+ resolve_chip,
45
+ )
43
46
  from firestarter.chip_test import (
44
47
  OP_ID,
45
48
  SDP_HOLD_NOT_RUN,
@@ -106,6 +109,7 @@ from firestarter.protection_readability import (
106
109
  protection_gate_for_entry,
107
110
  )
108
111
  from firestarter.sdp_capability import SDP_PROTOCOL_ID, sdp_capability
112
+ from firestarter.timestamps import iso_cet
109
113
 
110
114
  logger = logging.getLogger("Firestarter")
111
115
 
@@ -160,10 +164,17 @@ def _complete_eprom(
160
164
  semantics at main.py:39-45.
161
165
  """ # noqa: E501
162
166
  db = EpromDatabase()
163
- return [
164
- click.shell_completion.CompletionItem(e["name"])
167
+ qualified = db.names_needing_qualifier()
168
+ # A row whose name also names chips that program differently is offered
169
+ # by the qualified name that selects it.
170
+ names = (
171
+ qualified.get((e["manufacturer"], e["name"]), e["name"])
165
172
  for e in db.get_eproms()
166
- if e["name"].lower().startswith(incomplete.lower())
173
+ )
174
+ return [
175
+ click.shell_completion.CompletionItem(name)
176
+ for name in names
177
+ if name.lower().startswith(incomplete.lower())
167
178
  ]
168
179
 
169
180
 
@@ -486,7 +497,11 @@ def _list_cmd(app: AppContext) -> None:
486
497
  """List all EPROMs in the database."""
487
498
  eprom_data_list = app.db.get_eproms()
488
499
  if eprom_data_list:
489
- print_eprom_list_table(eprom_data_list, app.eprom_presenter.spec_builder)
500
+ print_eprom_list_table(
501
+ eprom_data_list,
502
+ app.eprom_presenter.spec_builder,
503
+ app.db.names_needing_qualifier(),
504
+ )
490
505
  sys.exit(0)
491
506
  sys.exit(1)
492
507
 
@@ -504,6 +519,9 @@ def info(app: AppContext, eprom: str, config: bool, adapter: bool) -> None:
504
519
  logger.error(f"EPROM '{eprom}' not found in database.")
505
520
  sys.exit(1)
506
521
 
522
+ ambiguity = describe_ambiguity(eprom, app.db)
523
+ if ambiguity:
524
+ logger.warning(ambiguity)
507
525
  eprom_data_for_programmer = app.db.convert_to_programmer(eprom_details)
508
526
  raw_config_data, manufacturer = app.db.get_eprom_config(eprom)
509
527
 
@@ -534,7 +552,11 @@ def search(app: AppContext, text: str) -> None:
534
552
  """Search for EPROMs in the database."""
535
553
  search_results = app.db.search_eprom(text)
536
554
  if search_results:
537
- print_eprom_list_table(search_results, app.eprom_presenter.spec_builder)
555
+ print_eprom_list_table(
556
+ search_results,
557
+ app.eprom_presenter.spec_builder,
558
+ app.db.names_needing_qualifier(),
559
+ )
538
560
  sys.exit(0)
539
561
  sys.exit(1)
540
562
 
@@ -1505,7 +1527,9 @@ def chip_id(app: AppContext, eprom: str, force: bool) -> None:
1505
1527
  for ic in found_eproms_for_detected_id
1506
1528
  ]
1507
1529
  print_eprom_list_table(
1508
- mapped_found_eproms, app.eprom_presenter.spec_builder
1530
+ mapped_found_eproms,
1531
+ app.eprom_presenter.spec_builder,
1532
+ app.db.names_needing_qualifier(),
1509
1533
  )
1510
1534
  else:
1511
1535
  logger.warning(
@@ -1908,10 +1932,10 @@ def fw(
1908
1932
 
1909
1933
  print(_json.dumps(releases, indent=2))
1910
1934
  else:
1911
- print(f"{'Version':<12} {'Channel':<14} {'Published':<22} Asset URL")
1935
+ print(f"{'Version':<12} {'Channel':<14} {'Published':<25} Asset URL")
1912
1936
  for r in releases:
1913
1937
  print(
1914
- f"{r['version']:<12} {r['channel']:<14} {r['published']:<22} {r['asset_url']}" # noqa: E501
1938
+ f"{r['version']:<12} {r['channel']:<14} {r['published']:<25} {r['asset_url']}" # noqa: E501
1915
1939
  )
1916
1940
  if not releases:
1917
1941
  print(f"No releases found for board {board}.")
@@ -2638,7 +2662,7 @@ def _write_artifact(
2638
2662
  out_path.mkdir(parents=True, exist_ok=True)
2639
2663
 
2640
2664
  artifact: Dict[str, Any] = { # noqa: UP006
2641
- "generated": datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%dT%H:%M:%SZ"),
2665
+ "generated": iso_cet(),
2642
2666
  "harness_version": "71",
2643
2667
  "cells": cells,
2644
2668
  }
@@ -3058,6 +3082,8 @@ def _canonical_part_number(part_number: str | None, raw_token: str) -> str | Non
3058
3082
  def _strip_paren(s: str) -> str:
3059
3083
  return re.sub(r"\([^)]*\)", "", s).strip().lower()
3060
3084
 
3085
+ # A manufacturer qualifier (PART@MANUFACTURER) is not part of the name.
3086
+ raw_token = raw_token.partition("@")[0].strip()
3061
3087
  query = raw_token.lower()
3062
3088
  if query == part_number.lower():
3063
3089
  return part_number
@@ -3166,6 +3192,10 @@ def dev_test(app: "AppContext", chip: str, fast: bool, submit: bool) -> None:
3166
3192
  # still runs the full community-validation sweep below.
3167
3193
  if not app.db.get_eprom(chip):
3168
3194
  raise ChipNotFoundError(f"{chip}: not found in database")
3195
+ # A name that selects chips that program differently is refused here,
3196
+ # not step by step: every step would be SKIPPED and the report would
3197
+ # name no chip.
3198
+ refuse_if_ambiguous(chip, app.db)
3169
3199
 
3170
3200
  # The chip must be known to be in the DB (see above) before its
3171
3201
  # electrical type can be read, so the UV-scope resolution happens here,
@@ -190,7 +190,7 @@
190
190
  "vpp_mv": 13000
191
191
  },
192
192
  "part_number": "AM27128A",
193
- "pinout": "DIP28_2764",
193
+ "pinout": "DIP28_27128",
194
194
  "programming": {
195
195
  "algorithm": 7,
196
196
  "chip_id_check": true,
@@ -366,7 +366,7 @@
366
366
  "vpp_mv": 13000
367
367
  },
368
368
  "part_number": "AM27C128",
369
- "pinout": "DIP28_2764",
369
+ "pinout": "DIP28_27128",
370
370
  "programming": {
371
371
  "algorithm": 7,
372
372
  "chip_id_check": true,
@@ -1478,7 +1478,7 @@
1478
1478
  "vpp_mv": 13000
1479
1479
  },
1480
1480
  "part_number": "SMJ27C128",
1481
- "pinout": "DIP28_2764",
1481
+ "pinout": "DIP28_27128",
1482
1482
  "programming": {
1483
1483
  "algorithm": 7,
1484
1484
  "chip_id_check": true,
@@ -1612,7 +1612,7 @@
1612
1612
  "vpp_mv": 13000
1613
1613
  },
1614
1614
  "part_number": "AT27C011",
1615
- "pinout": "DIP28_2764",
1615
+ "pinout": "DIP28_27011",
1616
1616
  "programming": {
1617
1617
  "algorithm": 7,
1618
1618
  "chip_id_check": true,
@@ -1700,7 +1700,7 @@
1700
1700
  "vpp_mv": 13000
1701
1701
  },
1702
1702
  "part_number": "AT27C128",
1703
- "pinout": "DIP28_2764",
1703
+ "pinout": "DIP28_27128",
1704
1704
  "programming": {
1705
1705
  "algorithm": 7,
1706
1706
  "chip_id_check": true,
@@ -3331,7 +3331,7 @@
3331
3331
  "vpp_mv": 13000
3332
3332
  },
3333
3333
  "part_number": "CAT27128A",
3334
- "pinout": "DIP28_2764",
3334
+ "pinout": "DIP28_27128",
3335
3335
  "programming": {
3336
3336
  "algorithm": 7,
3337
3337
  "chip_id_check": false,
@@ -4222,7 +4222,7 @@
4222
4222
  "vpp_mv": 13000
4223
4223
  },
4224
4224
  "part_number": "CY27C128",
4225
- "pinout": "DIP28_2764",
4225
+ "pinout": "DIP28_27128",
4226
4226
  "programming": {
4227
4227
  "algorithm": 7,
4228
4228
  "chip_id_check": false,
@@ -5403,7 +5403,7 @@
5403
5403
  "vpp_mv": 13000
5404
5404
  },
5405
5405
  "part_number": "NM27C128,NMC27C128B,NMC27C128C",
5406
- "pinout": "DIP28_2764",
5406
+ "pinout": "DIP28_27128",
5407
5407
  "programming": {
5408
5408
  "algorithm": 7,
5409
5409
  "chip_id_check": true,
@@ -5603,7 +5603,7 @@
5603
5603
  "vpp_mv": 21000
5604
5604
  },
5605
5605
  "part_number": "MBM27128",
5606
- "pinout": "DIP28_2764",
5606
+ "pinout": "DIP28_27128",
5607
5607
  "programming": {
5608
5608
  "algorithm": 7,
5609
5609
  "chip_id_check": false,
@@ -5735,7 +5735,7 @@
5735
5735
  "vpp_mv": 18000
5736
5736
  },
5737
5737
  "part_number": "MBM27C128P",
5738
- "pinout": "DIP28_2764",
5738
+ "pinout": "DIP28_27128",
5739
5739
  "programming": {
5740
5740
  "algorithm": 7,
5741
5741
  "chip_id_check": false,
@@ -6001,7 +6001,7 @@
6001
6001
  "vpp_mv": 13000
6002
6002
  },
6003
6003
  "part_number": "GR27128",
6004
- "pinout": "DIP28_2764",
6004
+ "pinout": "DIP28_27128",
6005
6005
  "programming": {
6006
6006
  "algorithm": 7,
6007
6007
  "chip_id_check": false,
@@ -6069,7 +6069,7 @@
6069
6069
  "vpp_mv": 13000
6070
6070
  },
6071
6071
  "part_number": "HN27128AG,HN27128AP",
6072
- "pinout": "DIP28_2764",
6072
+ "pinout": "DIP28_27128",
6073
6073
  "programming": {
6074
6074
  "algorithm": 7,
6075
6075
  "chip_id_check": true,
@@ -7031,7 +7031,7 @@
7031
7031
  "vpp_mv": 13000
7032
7032
  },
7033
7033
  "part_number": "D27011",
7034
- "pinout": "DIP28_2764",
7034
+ "pinout": "DIP28_27011",
7035
7035
  "programming": {
7036
7036
  "algorithm": 7,
7037
7037
  "chip_id_check": true,
@@ -7053,7 +7053,7 @@
7053
7053
  "vpp_mv": 13000
7054
7054
  },
7055
7055
  "part_number": "D27C011",
7056
- "pinout": "DIP28_2764",
7056
+ "pinout": "DIP28_27011",
7057
7057
  "programming": {
7058
7058
  "algorithm": 7,
7059
7059
  "chip_id_check": true,
@@ -7141,7 +7141,7 @@
7141
7141
  "vpp_mv": 18000
7142
7142
  },
7143
7143
  "part_number": "27128,D27128",
7144
- "pinout": "DIP28_2764",
7144
+ "pinout": "DIP28_27128",
7145
7145
  "programming": {
7146
7146
  "algorithm": 7,
7147
7147
  "chip_id_check": true,
@@ -7163,7 +7163,7 @@
7163
7163
  "vpp_mv": 12000
7164
7164
  },
7165
7165
  "part_number": "27128A,D27128A,D27128B",
7166
- "pinout": "DIP28_2764",
7166
+ "pinout": "DIP28_27128",
7167
7167
  "programming": {
7168
7168
  "algorithm": 7,
7169
7169
  "chip_id_check": true,
@@ -7339,7 +7339,7 @@
7339
7339
  "vpp_mv": 12000
7340
7340
  },
7341
7341
  "part_number": "27C128",
7342
- "pinout": "DIP28_2764",
7342
+ "pinout": "DIP28_27128",
7343
7343
  "programming": {
7344
7344
  "algorithm": 7,
7345
7345
  "chip_id_check": true,
@@ -8870,7 +8870,7 @@
8870
8870
  "vpp_mv": 13000
8871
8871
  },
8872
8872
  "part_number": "27C128",
8873
- "pinout": "DIP28_2764",
8873
+ "pinout": "DIP28_27128",
8874
8874
  "programming": {
8875
8875
  "algorithm": 7,
8876
8876
  "chip_id_check": true,
@@ -9406,7 +9406,7 @@
9406
9406
  "vpp_mv": 18000
9407
9407
  },
9408
9408
  "part_number": "M5M27C128",
9409
- "pinout": "DIP28_2764",
9409
+ "pinout": "DIP28_27128",
9410
9410
  "programming": {
9411
9411
  "algorithm": 7,
9412
9412
  "chip_id_check": false,
@@ -9806,7 +9806,7 @@
9806
9806
  "vpp_mv": 12000
9807
9807
  },
9808
9808
  "part_number": "UPD27128",
9809
- "pinout": "DIP28_2764",
9809
+ "pinout": "DIP28_27128",
9810
9810
  "programming": {
9811
9811
  "algorithm": 7,
9812
9812
  "chip_id_check": false,
@@ -9916,7 +9916,7 @@
9916
9916
  "vpp_mv": 12000
9917
9917
  },
9918
9918
  "part_number": "UPD27C128",
9919
- "pinout": "DIP28_2764",
9919
+ "pinout": "DIP28_27128",
9920
9920
  "programming": {
9921
9921
  "algorithm": 7,
9922
9922
  "chip_id_check": false,
@@ -10229,7 +10229,7 @@
10229
10229
  "vpp_mv": 13000
10230
10230
  },
10231
10231
  "part_number": "NM27C128,NMC27C128B,NMC27C128C",
10232
- "pinout": "DIP28_2764",
10232
+ "pinout": "DIP28_27128",
10233
10233
  "programming": {
10234
10234
  "algorithm": 7,
10235
10235
  "chip_id_check": true,
@@ -11277,7 +11277,7 @@
11277
11277
  "vpp_mv": 12000
11278
11278
  },
11279
11279
  "part_number": "M27128A",
11280
- "pinout": "DIP28_2764",
11280
+ "pinout": "DIP28_27128",
11281
11281
  "programming": {
11282
11282
  "algorithm": 7,
11283
11283
  "chip_id_check": true,
@@ -11916,7 +11916,7 @@
11916
11916
  "vpp_mv": 12000
11917
11917
  },
11918
11918
  "part_number": "ST27128A",
11919
- "pinout": "DIP28_2764",
11919
+ "pinout": "DIP28_27128",
11920
11920
  "programming": {
11921
11921
  "algorithm": 7,
11922
11922
  "chip_id_check": true,
@@ -13314,7 +13314,7 @@
13314
13314
  "vpp_mv": 12000
13315
13315
  },
13316
13316
  "part_number": "M27128A",
13317
- "pinout": "DIP28_2764",
13317
+ "pinout": "DIP28_27128",
13318
13318
  "programming": {
13319
13319
  "algorithm": 7,
13320
13320
  "chip_id_check": true,
@@ -13997,7 +13997,7 @@
13997
13997
  "vpp_mv": 12000
13998
13998
  },
13999
13999
  "part_number": "ST27128A",
14000
- "pinout": "DIP28_2764",
14000
+ "pinout": "DIP28_27128",
14001
14001
  "programming": {
14002
14002
  "algorithm": 7,
14003
14003
  "chip_id_check": true,
@@ -14889,7 +14889,7 @@
14889
14889
  "vpp_mv": 13000
14890
14890
  },
14891
14891
  "part_number": "SMJ27C128,TMS27C128,TMS27PC128",
14892
- "pinout": "DIP28_2764",
14892
+ "pinout": "DIP28_27128",
14893
14893
  "programming": {
14894
14894
  "algorithm": 7,
14895
14895
  "chip_id_check": true,
@@ -16270,7 +16270,7 @@
16270
16270
  "vpp_mv": 13000
16271
16271
  },
16272
16272
  "part_number": "WS27C128F",
16273
- "pinout": "DIP28_2764",
16273
+ "pinout": "DIP28_27128",
16274
16274
  "programming": {
16275
16275
  "algorithm": 7,
16276
16276
  "chip_id_check": true,
@@ -16358,7 +16358,7 @@
16358
16358
  "vpp_mv": 13000
16359
16359
  },
16360
16360
  "part_number": "WS57C128FB",
16361
- "pinout": "DIP28_2764",
16361
+ "pinout": "DIP28_27128",
16362
16362
  "programming": {
16363
16363
  "algorithm": 7,
16364
16364
  "chip_id_check": false,
@@ -22,10 +22,33 @@
22
22
  }
23
23
  },
24
24
  "DIP28_2764": {
25
- "name": "JEDEC 2764/128",
25
+ "name": "JEDEC 2764/27C64",
26
+ "comment": "infoic.xml pin map 21, which leaves pin 26 unbonded: pin 26 NC, and pin 27 PGM. The host sends PGM as the rw line, so the firmware holds it high for read. See datasheets/TMS2764.pdf.",
26
27
  "pins": {
27
28
  "vcc-pin": [28], "gnd-pin": [14], "vpp-pin": [1],
28
29
  "pgm-pin": [27], "nc-pin": [26],
30
+ "address-bus-pins": [10, 9, 8, 7, 6, 5, 4, 3, 25, 24, 21, 23, 2],
31
+ "data-bus-pins": [11, 12, 13, 15, 16, 17, 18, 19],
32
+ "ce-pin": [20], "oe-pin": [22]
33
+ }
34
+ },
35
+ "DIP28_27128": {
36
+ "name": "JEDEC 27128/27C128",
37
+ "comment": "infoic.xml pin map 22 (pin_map 0x00000c16), which bonds pin 26 as A13. Pin 27 is PGM; the host sends it as the rw line.",
38
+ "pins": {
39
+ "vcc-pin": [28], "gnd-pin": [14], "vpp-pin": [1],
40
+ "pgm-pin": [27],
41
+ "address-bus-pins": [10, 9, 8, 7, 6, 5, 4, 3, 25, 24, 21, 23, 2, 26],
42
+ "data-bus-pins": [11, 12, 13, 15, 16, 17, 18, 19],
43
+ "ce-pin": [20], "oe-pin": [22]
44
+ }
45
+ },
46
+ "DIP28_27011": {
47
+ "name": "27011 page-addressed EPROM",
48
+ "comment": "infoic.xml pin map 22 with pin_map 0x90000c16, which only the 27011 rows carry. Connectivity is <maps> index 22. The pin functions are the 27128 functions these rows had before the split; no 27011 datasheet was found to confirm them. Page selection is not implemented (henols/firestarter#136).",
49
+ "pins": {
50
+ "vcc-pin": [28], "gnd-pin": [14], "vpp-pin": [1],
51
+ "pgm-pin": [27],
29
52
  "address-bus-pins": [10, 9, 8, 7, 6, 5, 4, 3, 25, 24, 21, 23, 2, 26],
30
53
  "data-bus-pins": [11, 12, 13, 15, 16, 17, 18, 19],
31
54
  "ce-pin": [20], "oe-pin": [22]
@@ -33,7 +56,7 @@
33
56
  },
34
57
  "DIP28_JEDEC_SRAM_8K": {
35
58
  "name": "JEDEC 28-pin SRAM/FRAM 8K (6264/FM1608 family)",
36
- "comment": "Standard JEDEC parallel SRAM/FRAM 28-pin layout. Same address bus as DIP28_2764 (A0-A12 at pins 10,9,...,2 — 13 address bits for 8K). Differs from DIP28_2764 at: pin 1 = NC (vs VPP), pin 27 = !WE (vs !PGM), pin 26 = NC. Used by 6264-class SRAM and Ramtron FM1608 FRAM. Tentative — bench-validation required for chip-specific layouts.",
59
+ "comment": "Standard JEDEC parallel SRAM/FRAM 28-pin layout. Same address bus as DIP28_2764 (A0-A12 at pins 10,9,...,2 — 13 address bits for 8K). Differs from DIP28_2764 at: pin 1 = NC (vs VPP), pin 27 = !WE (vs !PGM). Used by 6264-class SRAM and Ramtron FM1608 FRAM. Tentative — bench-validation required for chip-specific layouts.",
37
60
  "pins": {
38
61
  "vcc-pin": [28], "gnd-pin": [14],
39
62
  "rw-pin": [27], "nc-pin": [1, 26],
@@ -164,4 +187,4 @@
164
187
  "ce-pin": [22], "oe-pin": [24], "rw-pin": [30]
165
188
  }
166
189
  }
167
- }
190
+ }