Add boxsim CLI: pure Python codec, netlist extraction, KiCad project generation

Replaces the bpj2ini.py prototype with a packaged tool. The A2F codec is now
reimplemented in Python, so neither Boxsim.exe nor a CPU emulator is needed to
decode a container; the emulator survives as a development-only oracle that the
codec is differentially tested against.

Verified:
- 134 containers decode byte-identically to Boxsim's own decoder, 270 pre-2.0
  files rejected by both implementations (tools/difftest.py --self-test)
- Default.BPJ: 22 components, 14 nets, no dangling terminal
- 22 of 22 parts resolve to library symbols; one series inferred from a
  sibling, two DC resistance deviations reported
- ERC clean and the netlist KiCad extracts from the generated sheet is an
  identical partition to the one derived from the Boxsim grid
- container build byte-identical to the host build
- 32 tests passing, ruff clean

Decode time went 69 s -> 14.5 s (binding emulator hooks to trap addresses)
-> 1.6 s (pure Python).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
magdevandClaude Fable 5 committed 2026-09-29 11:10:43 +02:00
1 parent eb81ca61cb
commit 4737a5bae8
28 files changed
+4459 -122

No files matched your search

+73
View File
@@ -0,0 +1,73 @@
from __future__ import annotations
import json
import shutil
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parent.parent
DIST = ROOT / "boxsim_dl" / "BoxSim 2.1 DE (Stand 12.2025)"
DEFAULT_BPJ = DIST / "Projekte" / "Default.BPJ"
MANIFEST = ROOT / "tests" / "oracle_manifest.json"
def pytest_configure(config):
config.addinivalue_line("markers", "needs_kicad: requires kicad-cli 10 on PATH")
config.addinivalue_line("markers", "needs_dist: requires the Boxsim distribution")
@pytest.fixture(scope="session")
def dist() -> Path:
if not DIST.exists():
pytest.skip(f"Boxsim distribution not present at {DIST}")
return DIST
@pytest.fixture(scope="session")
def default_bpj(dist: Path) -> Path:
if not DEFAULT_BPJ.exists():
pytest.skip("Default.BPJ not present")
return DEFAULT_BPJ
@pytest.fixture(scope="session")
def manifest() -> dict:
if not MANIFEST.exists():
pytest.skip("oracle manifest missing; run tools/difftest.py")
return json.loads(MANIFEST.read_text(encoding="utf-8"))
@pytest.fixture(scope="session")
def kicad_cli() -> str:
exe = shutil.which("kicad-cli")
if exe is None:
pytest.skip("kicad-cli not on PATH")
return exe
@pytest.fixture(scope="session")
def library():
from boxsim import symbols
try:
return symbols.load()
except symbols.SymbolError as exc:
pytest.skip(str(exc))
@pytest.fixture(scope="session")
def catalog():
from boxsim import catalog as catalog_mod
try:
return catalog_mod.load()
except catalog_mod.CatalogError as exc:
pytest.skip(str(exc))
@pytest.fixture(scope="session")
def default_project(default_bpj: Path):
from boxsim import model
return model.load(default_bpj.read_bytes())
+813
View File
@@ -0,0 +1,813 @@
{
"files": {
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/AL130-8.BCH": {
"len": 166589,
"sha256": "52563a9ec686c3fbb63ddcab63d21c18b3e42c1260816823c3be54e9296c7761"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/AL130M-8.BCH": {
"len": 166958,
"sha256": "6336ea4920427b8e90ef4d578f0d7c17a96eefd352f14aeead9e376dae6c6d03"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/AL170-8.BCH": {
"len": 167237,
"sha256": "85e527b16b6d4e5b9022899ffb68a377996d056b9759c1241560db2fafa7ade5"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/AL200-8.BCH": {
"len": 166398,
"sha256": "0f3df9168ef1bcdf50fc1c04dbdf2d71882c9ae712576e2c11531dc025fee46a"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/B100-6.BCH": {
"len": 167545,
"sha256": "acb0479980734856d8daef68f2d334af3b1d8b271503a65a143df0ef4002d653"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/B200-6.BCH": {
"len": 164948,
"sha256": "c9f66a0615ec5bbde6d04b0896729c1f127188501ebac074722a048240d71459"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/B80-8.BCH": {
"len": 167758,
"sha256": "046d00c3288d515148a05a08312d3432d69c803a068b3f83cadfa2fe2577716b"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BF32-4.BCH": {
"len": 168059,
"sha256": "b93583230b24073f4322cc32603cd5587690941f53673cc5cef34b8dfc667975"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BF32-8.BCH": {
"len": 167706,
"sha256": "b0bb6c9101c297f4939b7147ecaef2c3326b852414626617e2543b07b295f3a9"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BF32SWP-8.BCH": {
"len": 168621,
"sha256": "24a8a65637b5668723496126d4dea7edfe6b6562df54f4410e643f3233a7de07"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BF37-4.BCH": {
"len": 167856,
"sha256": "9b25d410d84252a18cf3c088d2a2586b94c57029ed41f104640407bb5a4b61eb"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BF37-8.BCH": {
"len": 167492,
"sha256": "3635f5db87a7a893d071959badebb42443a1b5ae881bee905527d79962ec1d1c"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BF45-4.BCH": {
"len": 168393,
"sha256": "589c6a365b2899b019c4c856eed621b2adf51951c39e9d24454421be923910cc"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BF45-8.BCH": {
"len": 167753,
"sha256": "fb1387ec0c26d0975b4ee2bd2948240c0fca6830d595435b034c87ecd5619297"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BG13P-8.BCH": {
"len": 167761,
"sha256": "2d7cc9dce5da0039c1cdb9808817dd6eb8a519832d8a0a32f99cbc0d82a2ab45"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BG17-8.BCH": {
"len": 167705,
"sha256": "63e521cddb82620b4b9866f2417c20126c810576ae61f875b7b8dd12f0d35d5c"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/BG20-8.BCH": {
"len": 158456,
"sha256": "0c616486aaa06dd4d728cab520b545ee00ab10774b041a8ad26bcecb6091e9fd"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DMR120-8.BCH": {
"len": 167930,
"sha256": "e9e0c6fce89307a392899516243993038e3429f3b48eb38ede3f87ebefb0630f"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DSM25FFL-8.BCH": {
"len": 169090,
"sha256": "7a29bb64a89f5c987b7991d1f6697a29bf81f997d027d2c85d0d3fe61fca6c3b"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DSM25FFL-8_WG.BCH": {
"len": 169024,
"sha256": "ff3769dc79fc4786beb1ee6769cb0ce11a3cff3defab1b9e053c5bc070beeb5e"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DSM50FFL-8.BCH": {
"len": 167782,
"sha256": "8a6e5a6fb43635e5f8f83002c931a1d6d4a9604b82b0736db94631c013661f63"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DT94-4.BCH": {
"len": 160517,
"sha256": "6667fef358fee4126876a61ab4f07e495f0470c675e2d6794b5dd89e9291b02d"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DT94-8.BCH": {
"len": 160866,
"sha256": "49125ad11ac0c6c8dde04c19fb3af43cc7c0eb98fb2e6717016b99839ee1a0ad"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DTW72-8.BCH": {
"len": 168472,
"sha256": "eaefc3e044514529b0d672df913a60e613e8882c4c2f1f5fe2e55b226dafe5eb"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DTW95FFL-8.BCH": {
"len": 168777,
"sha256": "4ed1a4afbf547551b0907d2c85afc4e9cce57c450f6f615803c1a6d5214035ac"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DX10-4.BCH": {
"len": 167756,
"sha256": "ecc54f732bf04757f58f1a2fa2875e0f034138eb9c67e2274ad236226f1e61d0"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/DX13-4.BCH": {
"len": 168631,
"sha256": "d5c9ca84e49f26e021bfb7166163ceb23ec392f3be7b96a625c9469f3f839253"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR10-4.BCH": {
"len": 167556,
"sha256": "88630ad18068860767b5c7a3d92d806c10bebc879f6a963b8a571a5651ae2206"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR10-8.BCH": {
"len": 167133,
"sha256": "bfd49bdc06e1149dae80c7e0f70273ceb4755fcc82690dc487496858cf54c411"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR10HM-4.BCH": {
"len": 168758,
"sha256": "143dc6f5e8615a77cb88dba96a21fdddb9a3eb9f31d5064681111a127d2d504c"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR10HM-8.BCH": {
"len": 167612,
"sha256": "a805602adc1fedc1650dbea4380016e155e773b752ab7b88921e7eb957aae1aa"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR10HMP-4.BCH": {
"len": 169371,
"sha256": "a29084a06ba41dbe58261751922e81e9f988f77d56223488b8e67d188d8d1117"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR12-4.BCH": {
"len": 169156,
"sha256": "3aa62ed143eef3e2e50f743945bc69dfb92473f991a88e294117d87b88a8c2b0"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR12-8.BCH": {
"len": 168523,
"sha256": "e3766981e2a15f50bc108204e5a0065a070986ac48b20092d14bcc794d1cb62a"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR58-4.BCH": {
"len": 168008,
"sha256": "9c9e7902e25f798da0cff00f0906c0fc9ddb8b459afa3fc53496de4c35078d76"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR58-8.BCH": {
"len": 167844,
"sha256": "37c87bec9e31d05a738533d8ab877446d26aafb0a0d567325075fe9595cd70df"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR8JS-8.BCH": {
"len": 167871,
"sha256": "f76ffb278e5a76732ee3d255b870e66a1cb806ebbb1330736df8718fe5b4b30c"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR8WP-4.BCH": {
"len": 168277,
"sha256": "e14621eb94f90aa72eea47a8c084f1a96839ec600e99c585fd1a1f519f3db97f"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR8WP-8.BCH": {
"len": 168292,
"sha256": "c9ba868f0ec01edf84d6d5488733b02f2f50853491d58068b75d7814e33980a1"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR9.15-4_horizontal.BCH": {
"len": 169606,
"sha256": "914cc40a0f02b1efa87a9e63f68690067b5512fdb71b1e69884a122f218fbdec"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FR9.15-4_vertikal.BCH": {
"len": 170049,
"sha256": "a88a684ce8a7f10aed0f72153c7f960bf06330331795eed68594b9915b55c00f"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS5X-8.BCH": {
"len": 166753,
"sha256": "a523d440bab1a96de5a96cee96c52f7c81bcf2c5b0a49de1ff7f8a8d97a08a5a"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS7-4.BCH": {
"len": 167982,
"sha256": "2e3c1c49436cf6b9f4a00c966ec6ef25301614cff448c5540ba72275f7b1e81d"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS7-8.BCH": {
"len": 168154,
"sha256": "3d119358c324194760264e0c26d6aec8c15d70fdb2b256456576c9d81bc22d49"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS7S-8.BCH": {
"len": 167984,
"sha256": "0c387f6e5147f04add4aebdafa97da2e754f3da07782f0aad0179c15603797f4"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS7W-8.BCH": {
"len": 168125,
"sha256": "520ab27b5bb120dde5a7a44f59e6d449996cb2c534b41332271847f781364785"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS7XWP-8.BCH": {
"len": 159786,
"sha256": "38b4433cf3cb7e09fd971ab8b56d8f067fc2997a973829bd57a72aa1f9000b06"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS8-4.BCH": {
"len": 167487,
"sha256": "5dd7e15bda43e727d8bcb34dbdbbdebdfd797b487af9b62d40440416537744fe"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS8-8.BCH": {
"len": 167191,
"sha256": "798183c313ef04fa9d0e2403c4131b0ba41fe2b704a99c24257c9ad9be1b27dc"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRS8M-8.BCH": {
"len": 167527,
"sha256": "0382528f2a44afdfe60fcbff1367b585a96a90bd9cab999e1e40dfd45051f3c5"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRWS4ND-8.BCH": {
"len": 168207,
"sha256": "63d9db35ef1e74ca0f080ef6c1a0b28d395aa971420bcb175c736e8b412849dc"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRWS5-4.BCH": {
"len": 167564,
"sha256": "6c74e49fe8e9d6bf4f6fc225fafd1a7fcd429a6d35a9b6fdf4f37bd7fb585dfb"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRWS5-8.BCH": {
"len": 167743,
"sha256": "f8ef5c31c3283c3653f3edd146b5bb649d476beb906b9622283da97167730200"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FRWS5SC-8.BCH": {
"len": 167460,
"sha256": "b07b81fed5818d2aa11b4364bd14e24b4f1b0caa6b661185a106abaea552a102"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FX10-4.BCH": {
"len": 167699,
"sha256": "4f70649c267f6d824f710c901daff648da072028a354966b9fc95cfe001ee467"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FX13-4.BCH": {
"len": 168491,
"sha256": "85c4ad73a053ff58676ffe31e5450bd9b2281d9910e05eeb71385e43df80d637"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FX16-4.BCH": {
"len": 168407,
"sha256": "df02baa2f1688ceddc5192da8546ddfac2b5746a7b1a459e0f6cc1c176d47886"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/FX16WP-4.BCH": {
"len": 168916,
"sha256": "f6c8d03f26a5f942dce524ddaf11931ba10e1436c26bf978dd6e04a235cbc3ed"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/G20SC-8.BCH": {
"len": 168972,
"sha256": "549ea20a17763d75052ad872b3e650639c56d49597f2c9f6fca747faeadcbab5"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/G25FFL-8.BCH": {
"len": 169098,
"sha256": "7004466c21b4a7e438d09e4b8373c20f58250adbf4e68c1998365151ba46fef4"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/G25FFL-8_WG.BCH": {
"len": 169005,
"sha256": "85d51691fb41410442c60efc9782c0b80061279f8571fafcf88129591b2715c1"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/G25NDWG-8.BCH": {
"len": 160482,
"sha256": "743de0c456c272620a8d5fcfe83e51a735f8ed88efa9681b95d1c4f4dc427abc"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/G50FFL-8.BCH": {
"len": 168413,
"sha256": "951e5a3bcce8bb0453cf0e3a8f58a9c89fa690fb99fc00bb5de949317d2bcdd5"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/G50FFL-8_WG.BCH": {
"len": 168650,
"sha256": "b3010ea9780428570922a513749110bfa83953cc7aa3c2b24abd503645aa66d4"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/GF200-2.BCH": {
"len": 166568,
"sha256": "13aa73962985e626969e37159c9a08f600b41fcad91ab1e6ad52584fe2b8b811"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/GF200-4.BCH": {
"len": 165632,
"sha256": "90a3164b9a602cebdab476370101146d6d058fd39c58bfa958159831cddf105e"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/GF200-8.BCH": {
"len": 166762,
"sha256": "be26e8616356d2bf9bbb5418383efaf3bf3aa8d6883ee3e0fe0eadd5d1dca03a"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/HT21_DR45-8_horizontal.BCH": {
"len": 169380,
"sha256": "57e5bede970aa72e4f524cc66c4d6e7fae8f549cf1487f31b21b60dae7b2d781"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/HT21_DR45-8_vertikal.BCH": {
"len": 169432,
"sha256": "3239c9fad549ed904f8b3df174e6a21325d5b0ace33e27fffcc001107358ca1e"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/HTH8.7-8_horizontal.BCH": {
"len": 169140,
"sha256": "03e2a4e185191161987279d6aefb6d396a11acaef781f3dc4a3b766447b1ef1b"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/HTH8.7-8_vertikal.BCH": {
"len": 169142,
"sha256": "dd51cbef66b6c5a848d1dc777ca4805d32f544ad89c7f53aa5bcbaf59f226fbb"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/HX10-4.BCH": {
"len": 167294,
"sha256": "997a8f9ba8763e9309d2cb640e21d923a9344d29be263f2be1d1a1eed875f6f1"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/KE25SC-8.BCH": {
"len": 169009,
"sha256": "3c0a8a5ef64bf27a102c8dd09c0d87b456c8fdac006a6095d1304f7a1edd7184"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/KE25SC-8_WG.BCH": {
"len": 169097,
"sha256": "81d987a1a2bf51ddf463d8422ce7881dc57b0cd7e0bd20fbd3e4f376abd69696"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/KT100V-4.BCH": {
"len": 167368,
"sha256": "82c4f9d62fe3114c4280a6cd63343833adbff29f398a9f94485fd0f763dcec03"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/MHT12-8_horizontal.BCH": {
"len": 169158,
"sha256": "eea5c3d1c7d8c12ee26bf2f0e4e93d7bb9a57c80ded560cf356ba22ad1168605"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/MHT12-8_vertikal.BCH": {
"len": 169757,
"sha256": "b294b6988b5745efa71547307690c8f1d3e1316c2b1184819fe24d0baf28fb35"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/PAM13-8.BCH": {
"len": 167870,
"sha256": "aab4c8c1e559807b96c8a53d04091c0296dc9c5ba8877f56af066dcdcdcabd31"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/PAW25-8.BCH": {
"len": 168066,
"sha256": "b594a2ea9297fc74cca7f22705ece652fa37565fa8ae885d493147dfb5be88a6"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/PAW30ND-8.BCH": {
"len": 167976,
"sha256": "1e0bc20347273e08f6c6c29139aa7921214b175b42f89c6a0b8ab65893b54676"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/R10S-4.BCH": {
"len": 170298,
"sha256": "121c01119b6aeb20464c09a6f0cdc8e4cdb17562ef1b86d850bdcbe665ad3176"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/R10S-8.BCH": {
"len": 168270,
"sha256": "fc6019cfb41cf4acee2e79f30503734abc4d0ae023f0ddc31d41f15c53ea3d53"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SC10N-8.BCH": {
"len": 169400,
"sha256": "9f5d425b353efbea1d3fba20f0bc18ec889b3c8164a9a7d15e6a7574a55cada8"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SC13-8.BCH": {
"len": 167377,
"sha256": "691a2b026ba63f9374e852cac955a91229cc6817912a4b1c366c1f6492b7b329"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SC4.6FL-8_horizontal.BCH": {
"len": 166596,
"sha256": "a80c5f54e0076c90b4caac9260b5aee77c8ee339d807963685d09c735b4eae6a"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SC4.6FL-8_vertikal.BCH": {
"len": 165391,
"sha256": "5e307e4738b21a52de10540d5fde9a1cbd22b272cb1a41751df82489eab5285a"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SC5-8.BCH": {
"len": 168689,
"sha256": "de0d2a411130436e596ff2c1ad97bfa679ba92e7e2b166cb71329ac5768b93e4"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SC8N-8.BCH": {
"len": 167245,
"sha256": "43fc053d9f583e2282660eec169f066ff4f92c904b46b5aba330d50d0cfe7d55"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SL70NDV-4.BCH": {
"len": 166825,
"sha256": "5277f8c2712d4a5fe57b0b64dfdfe73a616932b57e58d1aed8ef77bade362555"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SL713-4_horizontal.BCH": {
"len": 168817,
"sha256": "cfc643055f62e0a836e0f67720610663d32f6e3aba3c2c3bd0f14b86e3a3e6f8"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SL713-4_vertikal.BCH": {
"len": 168657,
"sha256": "26cc25623bbeb0b022785a190dfde7bcbdd0785a5a41f363a4599d79cf31ef10"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SL83-4.BCH": {
"len": 168108,
"sha256": "a35ff412b172c7ae23489ded7e12f2146c33bb3126d9a90a6ecf6c81c65f1ff1"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SL87FE-8.BCH": {
"len": 167737,
"sha256": "115d35c6aa8fc19d52a146dec2810e524a1580c8b31f46f27ad8ab339ea6eee6"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SL87FS-8.BCH": {
"len": 159847,
"sha256": "ce73e4b9e8f98efe44d85bf9c67a63cb65546c88b1ee4e4a5ccf5af9758208ac"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/SL87ND-8.BCH": {
"len": 166764,
"sha256": "1a2fa67bcd7cdddbfdeb30fd4b4f36d49ea11b44b52d195833cc9a9b9c490d1c"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/TI100-8.BCH": {
"len": 167102,
"sha256": "c9ef7266472e0c0a75de8fa05173ff8e6004f0e83f044557243b867af70d7558"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/TIW200XS-8.BCH": {
"len": 167275,
"sha256": "a57a4bfc5aa1185b758ba182da2417f98030d1f16ac658a84073e1894e270ff5"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/TIW250XS-8.BCH": {
"len": 167470,
"sha256": "e0acbe4e8a520e4cc3339bdbf8b9ee071e4580ecd575d03043f80bee7fe7fe24"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/TIW300-8.BCH": {
"len": 167601,
"sha256": "1f04190ed3fa3010d45f6f00366bdd55ff94e357ab8a031bd264503186412440"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/TW70-8.BCH": {
"len": 170337,
"sha256": "19083805ea97002c817871111cba605bc6b841bffba4373af2dc225b8ac2330e"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W100S-4.BCH": {
"len": 166693,
"sha256": "e267b8524a33c50eb485d46c0f2606908c1c2181172841d0b7902792722054b2"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W100S-8.BCH": {
"len": 166742,
"sha256": "bb509e566b55b46c1030b305fc6eeab22a52cca5323f94d45e9b92eb9b3d7e77"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W100X-2.BCH": {
"len": 168225,
"sha256": "c4ecd29f912e680977eeb4ff8d786ab4ce1bc3b7cdbf5e68fbd32df5354e0c54"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W100X-4.BCH": {
"len": 167513,
"sha256": "6b7eee3b7ca9e91e407409a9822a6706c13c375a0a423ba084f955fe0b6d39d0"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W100X-8.BCH": {
"len": 168268,
"sha256": "3377174cf9e99fa61d30307fa3f54c99e9dd18c10143abae90d4ef316083dbd3"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W130S-4.BCH": {
"len": 166620,
"sha256": "a4c52c72fac5c9ecffb0db7d4aa54ca82ec0d8cb6cd4bf9f3542401b277d2dcf"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W130S-8.BCH": {
"len": 166750,
"sha256": "6ed33ac44bbf9046eddd59ba7b54c3a3785d09244648555ae847683982c6909f"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W130X-2.BCH": {
"len": 167957,
"sha256": "0683f476f4eea32bc73351045ee3e221053ad197297cdd3bc4a2843b128267c1"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W130X-4.BCH": {
"len": 167030,
"sha256": "53ae4cffdf3ed2bf4cb19fadd22ba8dd8762c1063dbf7818a109add348506cf3"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W130X-8.BCH": {
"len": 167958,
"sha256": "2127c7eed9b6aa116ea2b5e3ddea0830e7816a6f61b66acd89b3912958fb594d"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W150X-4.BCH": {
"len": 169571,
"sha256": "8bc70cb3b380ab4d9bafefa6fbe72ebfb4c64b872dec02fc776f45194306e8d2"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W165A-2.BCH": {
"len": 167502,
"sha256": "660ad2655067e765d00ad735ae5a53a2b4b8eeda3934b9484361e04653c30053"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W170-8.BCH": {
"len": 166591,
"sha256": "ff5564f0a05f880267ca2d528f8d9534bb90629139d27d56a9125f207a07acaf"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W170S-4.BCH": {
"len": 166045,
"sha256": "83ae8d8d5c2f063b358ea4d2b7f60cc24c18af6d9a004d42266d2f1a2ac15846"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W170S-8.BCH": {
"len": 166277,
"sha256": "63606eca63bf6cff1df12b72bb01add86b20ec1d958370173f00916dfe671d47"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W200-4.BCH": {
"len": 167312,
"sha256": "2d2f991f058c141442a3bade8e849c63571ce5d965d4e4b5e1cd18dd6a57c0d5"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W200-8.BCH": {
"len": 166917,
"sha256": "02fbe70c17a3d142c36253fe75647f2514c84a85ef8b943029b0549163b02cc1"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W200S-4.BCH": {
"len": 167865,
"sha256": "1d18f05ec042c96834da5d8c8da5d778d1a90577ff3aeb5c5ec1ebf98f2367a7"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W200S-8.BCH": {
"len": 167988,
"sha256": "acc138abeb612ba105eb1918caceec5db809dd14d1b63461f3b7b3c84bc0c555"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W250-8.BCH": {
"len": 167424,
"sha256": "b91cdde6d85ded8133469e292e29ea3149375623ce2b8a89b5ce85d8f444c59f"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W250S-4.BCH": {
"len": 167964,
"sha256": "f5f1a678216f26c872668de068902e979bc3fc45ef14060760f74600f6976d4d"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W250S-8.BCH": {
"len": 167668,
"sha256": "0ff699238b80b2a129ca44f0c97925b0b553250a1cb0d234c298358fb097df31"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/W300-8.BCH": {
"len": 167900,
"sha256": "d0e9afe82f3124fa5e11325d6a7a8c4fb2970c0d64e7677a70412668e39cd791"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/WF130ND-8.BCH": {
"len": 166121,
"sha256": "95bf3e21b4af281133f63c6ddbd305ddcdbc022bcedc495a974caa388c2bc7e6"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/WS13E-8.BCH": {
"len": 167806,
"sha256": "afe345e6be400e9780b5ceb9c3a90c4f4f095ea61196e10a45ce2b2072344c57"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/WS17E-4.BCH": {
"len": 167482,
"sha256": "55817cab04efd7582edcda75c17bdb1288e94ce8b591359393b19df84a4048f2"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/WS17E-8.BCH": {
"len": 167230,
"sha256": "a5a5f0ffd1bf9120fdf2de0033f5d07dc6aaf213fcc0296d81b627093e8873ea"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/WS20E-4.BCH": {
"len": 167030,
"sha256": "775e9162ce2d763b72ea53037541b89fdce980583836baa9e023937567595137"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/WS20E-8.BCH": {
"len": 167098,
"sha256": "658cc7a40aeaa3154bbcba033bf41076d14d014673528745d3324c3fe734833f"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/aktuelle Daten 12.2025/WS25E-8.BCH": {
"len": 166786,
"sha256": "e99a0c69b3c590f276f165d2b45a79cb7d9a204045a0904ebe665beb3a568d21"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/nicht mehr erh\u00e4ltlich/DMR120-8.BCH": {
"len": 167930,
"sha256": "e9e0c6fce89307a392899516243993038e3429f3b48eb38ede3f87ebefb0630f"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/nicht mehr erh\u00e4ltlich/DTW95FFL-8.BCH": {
"len": 168777,
"sha256": "4ed1a4afbf547551b0907d2c85afc4e9cce57c450f6f615803c1a6d5214035ac"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/nicht mehr erh\u00e4ltlich/WS26SF-8.BCH": {
"len": 167601,
"sha256": "c8991c5973e0afa0298e3b6e5256fa72d6d56fca202d343c60376117c36872ff"
},
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Projekte/Default.BPJ": {
"len": 509573,
"sha256": "d687252660aeabff3be9203ebdc35cf35087266eda87eb3aa1c23b306983e552"
}
},
"note": "oracle digests from boxsim._oracle, see tools/difftest.py",
"rejected_not_myini2ck": [
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/AL130-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/AL130M-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/AL170-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/AL200-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/AL200DV-2x8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/B100-6.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/B200-6.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/B80-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BF32-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BF37-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BF45-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BG13-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BG13P-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BG17-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BG20-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BG30NG-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BGS40-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BZ130P-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/BZ300-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/CF25-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/CMC 10 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/CMC 10 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/CMC 12 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/CMC 12 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/CP13-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/CT25A-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DHT9-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DHT9-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DK121-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DK8P-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DL10-20.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DL10-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DL18-100V.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DL18_2-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DL5-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DL8-20.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DL8-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DMR120-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DMR35-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DR45N+M300-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DSM25FFL-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DSM38FFL-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DSM50FFL-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DT90-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DT90-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DT94-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DT94-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 104 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 110 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 110 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 76 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 76 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 76 SC - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 76 SC - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 78 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 78 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 80 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 80 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 80 SC - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 80 SC - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 87.130 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTC 87.130 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTW110NG-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTW72-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTW72-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTW8.12-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTW8.12NG-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTW95NG-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DTW97-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DX10-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DX13-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DX16-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DX4x6P-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/DX6x9-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/F8SC-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/F8SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR10-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR10-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR10F-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR10HM-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR10HM-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR10WP-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR12-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR12-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR13-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR13-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR13WP-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR16WP-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR58-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR58-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR6.5-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR7-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR8-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR8-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR87-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR8JS-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR8WP-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR8WP-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FR9.15-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS10WP-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS10WP-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS5-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS5X-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS5XWP-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS7-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS7-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS7S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS7W-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS8-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS8-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRS8M-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRWS5-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRWS5-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FRWS5SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/FX10-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/G20SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/G25FFL-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/G25FFL-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/G25HE-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/G25ND-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/G50FFL-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/G50FFL-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF200-2.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF200-2_ 2Spulen_parallel.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF200-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF200-4_1Spule_Kurzschluss.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF200-4_1Spule_offen.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF200-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF250-2.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF250-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/GF250-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/H11-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HTC 11.19 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HTC 11.19 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HTC 87 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HTC 87 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HTC 87 A - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HTC 87 A - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HTH8.7-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/HX10-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/K50-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/K50WP-50.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/K50WP-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/K57C-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/K64WP-50.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/K64WP-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/KE25SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/KT100V-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 13 HE - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 13 HE - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 16 HE - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 16 HE - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 20 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 20 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 20 X - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/LMC 20 X - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/M10-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/M10-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/MHT12-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/MR130-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/MR130-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/PAW25-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/PAW30ND-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/PAW38-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/PAW46-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/R10S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/R10S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/R10SC-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/R10SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC10N-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC13-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC4.7ND-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC4.7ND-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC4ND-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC5-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC5.9-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC5.9ND-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC5.9ND-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC8-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SC8N-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SL713-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SL87ND-8.bch",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SL87WP-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/SL87WP-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/T130-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/T200-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/T250-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/T300-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TI100-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TI100M-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW200XS-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW250-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW250XS-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW300-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW360-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW360DS-2.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW360DS-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW360DS-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW360X-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW400-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW400DS-2.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW400DS-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TIW400DS-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TL10B50-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TL14CH.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TL15D61-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TL16H-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TL4Falnico-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TL8C50F-6.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TW6NG-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/TW70-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W100S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W100S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W100SC-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W100SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W130S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W130S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W130SC-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W130SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W130X-2.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W130X-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W130X-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W170-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W170-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W170S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W170S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W170SC-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W170SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200-4.bch",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200-8.bch",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200NG-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200NG-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200SC-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W200SC-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W250-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W250NG-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W250NG-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W250S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W250S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W300-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W300-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W300NG-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W300NG-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W300S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W300S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W400S-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/W400S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WF130ND-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WHC 25 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WHC 25 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WHC 30 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WHC 30 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WHC 30 X - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WHC 30 X - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WPC 30 - 4 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WPC 30 - 8 Ohm.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS13BF-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS13E-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS13E-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS17BF-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS17E-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS17E-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS20E-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS20E-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS25E-4.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WS25E-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WSP21S-8.BCH",
"boxsim_dl/BoxSim 2.1 DE (Stand 12.2025)/Chassis/_alte Simulationsdaten BoxSim 1.2/WSP26S-8.BCH"
]
}
+107
View File
@@ -0,0 +1,107 @@
"""End to end: generate a project, then check KiCad agrees with Boxsim.
The netlist comparison is the real gate, so it gets its own teeth test: a
deliberately mis-wired schematic must be reported as a mismatch. A gate that
has never been shown to fail is decoration.
"""
from __future__ import annotations
import pytest
from boxsim import project as project_mod
from boxsim import verify
from boxsim.schematic import DEFAULT_PITCH_MM, SchematicBuilder, transform
def test_rotation_transform_matches_kicad():
# Derived empirically from KiCad's own demo schematics.
assert transform(0, 3.81, 2.54) == (3.81, -2.54)
assert transform(90, 3.81, 2.54) == (-2.54, -3.81)
assert transform(180, 3.81, 2.54) == (-3.81, 2.54)
assert transform(270, 3.81, 2.54) == (2.54, 3.81)
def test_pitch_must_clear_widest_symbol(library):
with pytest.raises(ValueError, match="widest symbol"):
SchematicBuilder(library, pitch=20.0)
SchematicBuilder(library, pitch=DEFAULT_PITCH_MM) # must not raise
@pytest.fixture(scope="module")
def built(tmp_path_factory, default_project, catalog, library):
outdir = tmp_path_factory.mktemp("kicad")
return project_mod.build(default_project, "Default", outdir, catalog, library)
def test_project_files_written(built):
assert built.schematic.exists()
assert built.project_file.exists()
assert (built.directory / "sym-lib-table").exists()
assert (built.directory / "fp-lib-table").exists()
text = built.schematic.read_text(encoding="utf-8")
assert text.startswith("(kicad_sch")
assert "(version 20260101)" in text
assert "extends" not in text, "derived symbols must be flattened"
def test_all_components_placed(built, default_project):
assert len(built.sheet.placements) == len(default_project.crossovers[0].components)
refdes = [p.refdes for p in built.sheet.placements]
assert len(set(refdes)) == len(refdes), "reference designators must be unique"
assert sum(1 for r in refdes if r.startswith("LS")) == 3
assert sum(1 for r in refdes if r.startswith("J")) == 1
def test_output_is_deterministic(tmp_path, default_project, catalog, library):
a = project_mod.build(default_project, "Default", tmp_path / "a", catalog, library)
b = project_mod.build(default_project, "Default", tmp_path / "b", catalog, library)
assert a.schematic.read_text() == b.schematic.read_text(), (
"UUIDs must be derived, not random, so regeneration is reproducible"
)
@pytest.mark.needs_kicad
def test_gate_passes(built, default_project, kicad_cli):
gate = verify.run_gate(
built.schematic, default_project.crossovers[0], built.sheet.placements
)
assert gate.erc_ok, gate.messages
assert gate.netlist_matches, gate.messages
assert len(gate.reference_nets) == 14
@pytest.mark.needs_kicad
def test_gate_has_teeth(tmp_path, default_project, catalog, library, kicad_cli):
"""Swap one component's terminals and confirm the gate reports it.
The reference netlist is derived from the Boxsim grid while the compared one
is extracted from the sheet by KiCad, so mis-wiring a single part must break
the comparison. If this ever passes, the gate proves nothing.
"""
result = project_mod.build(
default_project, "Broken", tmp_path / "broken", catalog, library
)
crossover = default_project.crossovers[0]
# Pick a component whose two terminals are on different nets, then lie about
# which grid node one of its pins reaches.
netlist = crossover.build_netlist()
victim = next(
p
for p in result.sheet.placements
if len({netlist.net_of(n) for n in p.pin_nodes.values()}) == 2
)
pins = sorted(victim.pin_nodes)
victim.pin_nodes[pins[0]], victim.pin_nodes[pins[1]] = (
victim.pin_nodes[pins[1]],
victim.pin_nodes[pins[0]],
)
gate = verify.run_gate(result.schematic, crossover, result.sheet.placements)
assert not gate.netlist_matches, (
"a swapped terminal was not detected: the netlist comparison is not "
"actually comparing anything"
)
assert not gate.ok
assert any("mismatch" in m for m in gate.messages)
+79
View File
@@ -0,0 +1,79 @@
"""Codec tests. The heavy differential sweep against Boxsim.exe lives in
tools/difftest.py; these guard regressions against the digests it recorded.
"""
from __future__ import annotations
import hashlib
from pathlib import Path
import pytest
from boxsim import a2f, container
from boxsim.krypt import KryptPRNG
ROOT = Path(__file__).resolve().parent.parent
def test_keystream_is_stable():
"""Regression guard on the keystream every Boxsim file is scrambled with.
The value is not independently derived, it is the keystream under which all
134 containers in the distribution decode byte-identically to Boxsim's own
decoder (see tools/difftest.py). Its worth here is catching an accidental
change to the generator, not proving the generator correct.
"""
ks = KryptPRNG().keystream(8)
assert ks.hex() == "ebe14331cb3183e1"
def test_rejects_foreign_file():
with pytest.raises(container.ContainerError, match="not a MyIni2CK file"):
container.decode(b"not a boxsim file at all")
def test_truncated_stream_fails_loudly():
raw = (ROOT / "boxsim_dl" / "BoxSim 2.1 DE (Stand 12.2025)"
/ "Projekte" / "Default.BPJ")
if not raw.exists():
pytest.skip("distribution not present")
data = raw.read_bytes()
with pytest.raises(a2f.A2FError):
container.decode(data[: len(data) // 2])
def test_padding_allowance_is_bounded():
# A stream of zeros must not decode forever; it has to hit the limit.
with pytest.raises(a2f.A2FError):
a2f.expand(b"MyIni2CK", skip_magic=8)
@pytest.mark.needs_dist
def test_matches_oracle_digests(manifest: dict):
"""Every container the oracle decoded must still decode identically."""
files = manifest["files"]
assert files, "manifest has no entries"
checked = 0
for rel, expected in files.items():
path = ROOT / rel
if not path.exists():
pytest.fail(f"manifest references missing file {rel}")
payload = container.decode(path.read_bytes())
digest = hashlib.sha256(payload).hexdigest()
assert digest == expected["sha256"], f"{rel} digest changed"
assert len(payload) == expected["len"], f"{rel} length changed"
checked += 1
assert checked == len(files)
@pytest.mark.needs_dist
def test_pre20_containers_are_rejected(manifest: dict):
"""The BoxSim 1.2 files use an older container and must stay rejected."""
rejected = manifest["rejected_not_myini2ck"]
assert rejected, "manifest recorded no rejected files"
for rel in rejected:
path = ROOT / rel
if not path.exists():
continue
with pytest.raises(container.ContainerError):
container.decode(path.read_bytes())
+92
View File
@@ -0,0 +1,92 @@
from __future__ import annotations
import pytest
from boxsim import model
from boxsim.model import COLS, LINK_BASE, ROWS, TOTAL_SLOTS, Orientation, PartType
def test_slot_partition_is_exact():
"""The three slot ranges must tile 1..375 with no gap or overlap."""
seen = {}
for slot in range(1, TOTAL_SLOTS + 1):
orientation, row, col = model.slot_geometry(slot)
if orientation == Orientation.LINK:
continue
key = (orientation, row, col)
assert key not in seen, f"slot {slot} collides with {seen[key]}"
seen[key] = slot
horizontal = sum(1 for k in seen if k[0] == Orientation.HORIZONTAL)
vertical = sum(1 for k in seen if k[0] == Orientation.VERTICAL)
assert horizontal == (COLS - 1) * ROWS == 180
assert vertical == COLS * (ROWS - 1) == 187
assert LINK_BASE == 368 and TOTAL_SLOTS == 375
def test_slot_geometry_bounds():
with pytest.raises(model.ModelError):
model.slot_geometry(0)
with pytest.raises(model.ModelError):
model.slot_geometry(TOTAL_SLOTS + 1)
def test_slot_endpoints_are_adjacent_nodes():
orientation, row, col = model.slot_geometry(1)
assert (orientation, row, col) == (Orientation.HORIZONTAL, 0, 0)
orientation, row, col = model.slot_geometry(181)
assert (orientation, row, col) == (Orientation.VERTICAL, 0, 0)
# The last vertical slot must sit on the bottom-but-one row.
orientation, row, col = model.slot_geometry(367)
assert (orientation, row, col) == (Orientation.VERTICAL, ROWS - 2, COLS - 1)
def test_default_project_shape(default_project):
p = default_project
assert p.version == 2000
assert p.amp_count == 1
assert p.chassis_count == 3
assert [c.name for c in p.chassis] == [
"GF 200 - 8 Ohm",
"B 100 - 6 Ohm",
"G 20 SC - 8 Ohm",
]
def test_default_netlist_is_closed(default_project):
"""The published Default project must have no floating terminal."""
xo = default_project.crossovers[0]
netlist = xo.build_netlist()
assert len(xo.components) == 22
assert netlist.net_count == 14
assert netlist.dangling() == []
def test_drivers_and_amp_present(default_project):
xo = default_project.crossovers[0]
drivers = [p for p in xo.components if p.typ == PartType.DRIVER]
amps = [p for p in xo.components if p.typ == PartType.AMP_INPUT]
assert len(amps) == 1
assert sorted(d.chassis_index for d in drivers) == [0, 1, 2]
def test_bounding_box(default_project):
assert default_project.crossovers[0].bounding_box() == (0, 0, 8, 9)
def test_crossover_corner_frequencies(default_project):
"""Sanity-check the reconstruction against loudspeaker physics.
A wrong slot-to-node mapping would still produce a netlist, but not one
whose series/shunt pairs land on sensible crossover points.
"""
import math
xo = default_project.crossovers[0]
by_slot = {p.slot: p for p in xo.components}
# Woofer low-pass: 4.7 mH series with the 15 uF shunt.
fc = 1 / (2 * math.pi * math.sqrt(by_slot[5].value * by_slot[198].value))
assert 550 < fc < 650
# Tweeter high-pass: two series caps into the 0.22 mH shunt.
cser = 1 / (1 / by_slot[65].value + 1 / by_slot[67].value)
fc = 1 / (2 * math.pi * math.sqrt(by_slot[252].value * cser))
assert 5000 < fc < 6500
+133
View File
@@ -0,0 +1,133 @@
from __future__ import annotations
import pytest
from boxsim import symbols
from boxsim.catalog import SERIES_TO_SYMBOL
from boxsim.model import Orientation, Part, PartType
def test_catalogue_shape(catalog):
"""Guard the figures the resolver design relies on."""
assert len(catalog) == 95
assert len(catalog.series_names) == 11
assert set(catalog.series_names) == set(SERIES_TO_SYMBOL)
# The last catalogue line is a real part; the file has no trailing newline
# and is easy to truncate by one.
assert catalog.find("SP 1,3mm", 2.2e-3) is not None
def test_every_catalogue_part_has_a_symbol(catalog, library):
extras = symbols.cross_check(catalog, library)
assert extras == ["MKT 22μF"], (
"library should contain exactly the catalogue plus Amplifier, Speaker "
"and the radial MKT 22uF that Boxsim cannot select"
)
def test_library_values_are_matched_numerically(library):
"""Irregular library names must still resolve: 1.0uF next to 10uF."""
assert library.lookup("MKP", 1e-6) is not None
assert library.lookup("MKP", 10e-6) is not None
assert library.lookup("SP-Spule", 1e-3, "0.6").name == "SP-Spule 1.0mH (0.6)"
assert library.lookup("LR-Spule", 10e-3).name == "LR-Spule 10mH"
def test_derived_symbols_resolve_geometry(library):
"""Most symbols use `extends`; pins live on the base symbol."""
from boxsim.schematic import symbol_pins
pins = symbol_pins(library, "SP-Spule 0.82mH (0.6)")
assert len(pins.by_number) == 2
assert library.base_of("SP-Spule 0.82mH (0.6)") == "FC-Spule 10mH"
def test_flattened_definition_has_no_extends(library):
body = library.definition("SP-Spule 0.82mH (0.6)")
assert "extends" not in body
assert '(symbol "SP-Spule 0.82mH (0.6)_' in body, "graphics must be inlined"
def test_default_project_fully_resolves(catalog, library, default_project):
resolver = symbols.Resolver(catalog, library)
components = default_project.crossovers[0].components
results = resolver.resolve_all(components)
assert len(results) == len(components) == 22
assert all(r.symbol in library for r in results)
def test_empty_series_is_inferred_from_sibling(catalog, library, default_project):
resolver = symbols.Resolver(catalog, library)
components = default_project.crossovers[0].components
results = {r.part.slot: r for r in resolver.resolve_all(components)}
part231 = results[231]
assert part231.inferred_series is True
assert part231.symbol == "MKT-A 15μF", "sibling Part198 is an MKT-A 15uF"
def test_dcr_deviation_is_reported_not_corrected(catalog, library, default_project):
resolver = symbols.Resolver(catalog, library)
results = {
r.part.slot: r
for r in resolver.resolve_all(default_project.crossovers[0].components)
}
assert results[5].dcr_note is not None, "0.28 vs catalogue 0.33"
assert results[48].dcr_note is not None, "5 vs catalogue 4.8"
assert results[5].part.dcr == 0.28, "the project value must win"
def test_unstocked_value_is_a_hard_error(catalog, library):
resolver = symbols.Resolver(catalog, library)
part = Part(
slot=1,
typ=PartType.CAPACITOR,
orientation=Orientation.HORIZONTAL,
row=0,
col=0,
node_a=0,
node_b=1,
value=13e-6, # not a Visaton value
label="MKT-A",
)
with pytest.raises(symbols.SymbolError, match="not stocked"):
resolver.resolve(part)
def test_unknown_series_is_a_hard_error(catalog, library):
resolver = symbols.Resolver(catalog, library)
part = Part(
slot=2,
typ=PartType.CAPACITOR,
orientation=Orientation.HORIZONTAL,
row=0,
col=0,
node_a=0,
node_b=1,
value=10e-6,
label="Mundorf Supreme",
)
with pytest.raises(symbols.SymbolError, match="not in the Visaton catalogue"):
resolver.resolve(part)
def test_catalogue_shape_check_has_teeth(catalog):
"""A truncated catalogue must be rejected, not silently accepted.
`cross_check` only proves the catalogue is a subset of the library, so a
short catalogue passes it and then rejects valid projects at runtime with
"not stocked by Visaton". This is the check that catches it.
"""
from boxsim import catalog as catalog_mod
catalog_mod.check_shape(catalog) # the real thing must pass
short = catalog_mod.Catalog(catalog.parts[:40])
with pytest.raises(catalog_mod.CatalogError, match="expected"):
catalog_mod.check_shape(short)
# Losing a whole series must also be caught, even at the right total.
without_sp13 = catalog_mod.Catalog(
[p for p in catalog.parts if p.series != "SP 1,3mm"]
)
with pytest.raises(catalog_mod.CatalogError):
catalog_mod.check_shape(without_sp13)