oscura 0.5.0__py3-none-any.whl → 0.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oscura/__init__.py +1 -1
- oscura/analyzers/digital/__init__.py +0 -48
- oscura/analyzers/digital/extraction.py +0 -195
- oscura/analyzers/protocols/__init__.py +1 -22
- oscura/automotive/__init__.py +1 -1
- oscura/automotive/dtc/data.json +2763 -0
- oscura/export/__init__.py +0 -12
- oscura/export/wireshark/README.md +15 -15
- oscura/exporters/json_export.py +0 -47
- oscura/inference/active_learning/README.md +7 -7
- oscura/pipeline/composition.py +10 -2
- oscura/reporting/__init__.py +0 -7
- oscura/reporting/templates/index.md +13 -13
- oscura/schemas/bus_configuration.json +322 -0
- oscura/schemas/device_mapping.json +182 -0
- oscura/schemas/packet_format.json +418 -0
- oscura/schemas/protocol_definition.json +363 -0
- oscura/utils/autodetect.py +1 -5
- oscura-0.5.1.dist-info/METADATA +583 -0
- {oscura-0.5.0.dist-info → oscura-0.5.1.dist-info}/RECORD +23 -28
- oscura/analyzers/digital/ic_database.py +0 -498
- oscura/analyzers/digital/timing_paths.py +0 -339
- oscura/analyzers/digital/vintage.py +0 -377
- oscura/analyzers/digital/vintage_result.py +0 -148
- oscura/analyzers/protocols/parallel_bus.py +0 -449
- oscura/export/wavedrom.py +0 -430
- oscura/exporters/vintage_logic_csv.py +0 -247
- oscura/reporting/vintage_logic_report.py +0 -523
- oscura/visualization/digital_advanced.py +0 -718
- oscura/visualization/figure_manager.py +0 -156
- oscura-0.5.0.dist-info/METADATA +0 -407
- {oscura-0.5.0.dist-info → oscura-0.5.1.dist-info}/WHEEL +0 -0
- {oscura-0.5.0.dist-info → oscura-0.5.1.dist-info}/entry_points.txt +0 -0
- {oscura-0.5.0.dist-info → oscura-0.5.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
oscura/__init__.py,sha256=
|
|
1
|
+
oscura/__init__.py,sha256=HLrjN-2YU438b35k94HDMDFbOpzj3_2zc9NlcB7ImHM,18313
|
|
2
2
|
oscura/__main__.py,sha256=l1rnaD-tpI1W3cp1VHGhSdq9NDqw6Gxjf_gnqXf-zzE,11786
|
|
3
3
|
oscura/convenience.py,sha256=o8f1Im8WpakGXRz8D4bV-XSNkzpgnVjsyVxnaxZ-dg4,14612
|
|
4
4
|
oscura/exceptions.py,sha256=Ywyi7IhEG9XmbceCxAcLGKAddAOdP9Ph1ZT2NioMQCU,1606
|
|
@@ -14,20 +14,16 @@ oscura/acquisition/visa.py,sha256=phUwdlbphvNhSCaRgIXuPb8YDP0jR4eqY-OuJXCgRCo,12
|
|
|
14
14
|
oscura/analyzers/__init__.py,sha256=LE-KFYoVePYsiPIy2NDNB2OrzbtqYezdCu9xqqPxgrY,985
|
|
15
15
|
oscura/analyzers/measurements.py,sha256=ng5Qt2jyAvfKw3JQbJY_JNUqAOJEZwPo3UWa0xSg5Xk,697
|
|
16
16
|
oscura/analyzers/validation.py,sha256=vHSKmLThwcU0j5Dat9QPbWImw_dqUGaZk_Ul6XbJ958,20376
|
|
17
|
-
oscura/analyzers/digital/__init__.py,sha256=
|
|
17
|
+
oscura/analyzers/digital/__init__.py,sha256=CrZxLveYI-nZ7INCZg-4zp8UP_uQRpMmX2vljzudJ6s,4228
|
|
18
18
|
oscura/analyzers/digital/bus.py,sha256=Wf3QUKNSxzXaWItR1rdf32kELayywrIg0TC-OhKEub0,22717
|
|
19
19
|
oscura/analyzers/digital/clock.py,sha256=2WihQyf2fUlKTDAOKrhQSStiuUw711CvR6bMbkiliAc,26088
|
|
20
20
|
oscura/analyzers/digital/correlation.py,sha256=_D-pmymVU1rTemSUfg_MklXCo03VkfAFcxSTLAV6jcY,23689
|
|
21
21
|
oscura/analyzers/digital/edges.py,sha256=-Mlyh_SFkqs7L2n11bfYlv8bHD-jrfV6UByhXS1DLp0,20018
|
|
22
|
-
oscura/analyzers/digital/extraction.py,sha256=
|
|
23
|
-
oscura/analyzers/digital/ic_database.py,sha256=UUyeK1ckJXzv3oKhNOMJQcm9kmCx6g6SBA-eVHvvGO4,12393
|
|
22
|
+
oscura/analyzers/digital/extraction.py,sha256=wBOPZi3H1llCHsq36txz_jkEO--Sj6pbsxPZXXGk5_c,12144
|
|
24
23
|
oscura/analyzers/digital/quality.py,sha256=bMXpmAhs15tjyiWW0Ao5aZcK_8AvEKyo_E3rtxDrFlo,27413
|
|
25
24
|
oscura/analyzers/digital/signal_quality.py,sha256=Ssb1MkUfqjiENJJFOslkTX8Ef6C65HFCM_Ra20Bvp4k,30130
|
|
26
25
|
oscura/analyzers/digital/thresholds.py,sha256=CrGgO1rtzkUOnYb40UT3_uD_0qVA853lGL2WNL95qv4,22428
|
|
27
26
|
oscura/analyzers/digital/timing.py,sha256=eOo1jk-FfUd3tkqDndPTz-JO5tnfW9w4dEI-klgW-QU,34862
|
|
28
|
-
oscura/analyzers/digital/timing_paths.py,sha256=SQY7L7QPEm3IuiZGRULJtRJT1AbSLrc4OtKbahwb4eo,10433
|
|
29
|
-
oscura/analyzers/digital/vintage.py,sha256=3Ayufv-q2B4flhSG2DOrJkrIuiHnHDv5hbUHTR3dQQU,13910
|
|
30
|
-
oscura/analyzers/digital/vintage_result.py,sha256=Rn71FVyptdbP1gF-TvR3VX5ANIW2bi5YpM8huxyLKyU,4575
|
|
31
27
|
oscura/analyzers/eye/__init__.py,sha256=SRW0Ir-1RWLwoaenk6FZhGOIWPkuhevYTPt_-8thPw0,974
|
|
32
28
|
oscura/analyzers/eye/diagram.py,sha256=T3QwuZ3nvlHzSkmjp47ariRlt3FnfsK6yh3WsPszhmI,13307
|
|
33
29
|
oscura/analyzers/eye/metrics.py,sha256=QDwtMxiBPSXbUCyFnTiAgWllbVCrcI4xEo6teZc3Cm8,17210
|
|
@@ -61,7 +57,7 @@ oscura/analyzers/power/ripple.py,sha256=4JZVeZxEivzoThKKTynSTgWEU_453QcoRtASmaYg
|
|
|
61
57
|
oscura/analyzers/power/soa.py,sha256=lz6ExB-j-nCWAFSuPVd-TeSA4KD3QEasvZTzhBCaKnE,11019
|
|
62
58
|
oscura/analyzers/power/switching.py,sha256=6GKfrM0LBfsSFoCCK8kAGQ48tbxnPsUWQ393iypBb0A,15884
|
|
63
59
|
oscura/analyzers/protocol/__init__.py,sha256=DKCoqmpPHgB-Bz65GXArcoqScd714GAbL2eFxcccZEY,3035
|
|
64
|
-
oscura/analyzers/protocols/__init__.py,sha256=
|
|
60
|
+
oscura/analyzers/protocols/__init__.py,sha256=nSW_dtZOL_m-qBvrQ8cgFiVKqsr8zehKvm3sf-9O8Rs,3376
|
|
65
61
|
oscura/analyzers/protocols/base.py,sha256=muw9p0LbItduhB2qgt8F0aGodeyVrbM_-6rIIk6ZPfA,13651
|
|
66
62
|
oscura/analyzers/protocols/can.py,sha256=pJGzMrjYJcaPrShdCxw7EMzwUlSNyvhBfuzOUha4JeQ,17810
|
|
67
63
|
oscura/analyzers/protocols/can_fd.py,sha256=MYyB9y6LqUy1zZW0papzajU_RMJFnQeW2_6LTv9qjSM,12992
|
|
@@ -73,7 +69,6 @@ oscura/analyzers/protocols/jtag.py,sha256=CEQWx6g22v2fc14c7d8r2dyeqyfslA9BjKOdl0
|
|
|
73
69
|
oscura/analyzers/protocols/lin.py,sha256=JEzF105t-3NeZGx0o-jrOj8JJ5NbU-ZgIWa9r_tKEOw,13692
|
|
74
70
|
oscura/analyzers/protocols/manchester.py,sha256=C01r2u-DZQ-Zlb9P2wYHa-YpKz48HM7wSQAhSdrXNTI,10279
|
|
75
71
|
oscura/analyzers/protocols/onewire.py,sha256=rZHg1zEuIIeHDqKhGS5LEC8lwiWGtdtW0i3Eo8RblFo,15852
|
|
76
|
-
oscura/analyzers/protocols/parallel_bus.py,sha256=sv0e_GzmcwnP_3nPz10ycWrLbaciuD5QoKVaE7q6vpw,14498
|
|
77
72
|
oscura/analyzers/protocols/spi.py,sha256=gl0LVpZVI22tr7h5D1OAdDtlY_krb7CdNCNP10DirRI,10740
|
|
78
73
|
oscura/analyzers/protocols/swd.py,sha256=NAInX2bZyZFCM03CLjjxraYTV7cCGOzcl_OEXU21qZE,10155
|
|
79
74
|
oscura/analyzers/protocols/uart.py,sha256=6bf9EFHjHjkSeTxBq8b6GRlp1xWlBh65HuUcmWxWAEA,12188
|
|
@@ -115,7 +110,7 @@ oscura/api/fluent.py,sha256=Bvo1yVqqn3nmVWaoPv4C-YtYszBhHmdW8m5NdyhWEEo,15373
|
|
|
115
110
|
oscura/api/operators.py,sha256=To4PZUrwInD43T7i2Sy8YD04eLoRsmrD6XYePuExUX8,13853
|
|
116
111
|
oscura/api/optimization.py,sha256=5R6rPByVsyxla6oq4SjxjxEp9Uplog4owzsIuFcVoR0,11875
|
|
117
112
|
oscura/api/profiling.py,sha256=vkYinleXrznWdd0OT5zIJN_PW289GQE_ODmR9DaCcQ0,10567
|
|
118
|
-
oscura/automotive/__init__.py,sha256=
|
|
113
|
+
oscura/automotive/__init__.py,sha256=MB7wS93P5QUEWv_DjhlcTgGb1bYD9bib0uKBZksnylc,2538
|
|
119
114
|
oscura/automotive/visualization.py,sha256=2ILQjzNwCwj6zZ4MEsBS-QLwYFKMO0_0xDsbv3gEXu0,10692
|
|
120
115
|
oscura/automotive/can/__init__.py,sha256=0WCLgE6juqQF_mTO716tWzfziOcM6cjshdb957G0edw,1283
|
|
121
116
|
oscura/automotive/can/analysis.py,sha256=0z6MycxuJGusqDQhYEpHnGRmDw3OMf5yDbS8zI6GJO0,11251
|
|
@@ -132,6 +127,7 @@ oscura/automotive/dbc/__init__.py,sha256=7s36h4LQrJKKkO3ICHeuVCoYVx8jGnHT_wKcJgO
|
|
|
132
127
|
oscura/automotive/dbc/generator.py,sha256=EqJKJikAK2Neaff2H9AGb8ZnseE8m4lFAFRMXEIwjsY,5616
|
|
133
128
|
oscura/automotive/dbc/parser.py,sha256=mOUOJEF82cb7pqMvjedowB8AggCnxoR252vpSy5kC2Q,4591
|
|
134
129
|
oscura/automotive/dtc/__init__.py,sha256=09CgvnClJTQIvzgDOQ22CbcjGAg_zOhPlbm1-k-gl30,895
|
|
130
|
+
oscura/automotive/dtc/data.json,sha256=OrymnbjQkVMdJlIeQ6MUDIihkd9Kea-YvAizZwOZWcc,80011
|
|
135
131
|
oscura/automotive/dtc/database.py,sha256=We6Kq_lQNHCy9eGKLg-5ArMZ5KOlWK8599_J-67h3DU,9550
|
|
136
132
|
oscura/automotive/j1939/__init__.py,sha256=aiyfUq3GkJhgpxfkzsX7n_-E7B9Ls0XSnFxRI12GF28,340
|
|
137
133
|
oscura/automotive/j1939/decoder.py,sha256=qSfok5RTuwc4vR5sjnEdTOi06TwaNfIhBtZq6Vpzhik,25115
|
|
@@ -240,9 +236,8 @@ oscura/exploratory/parse.py,sha256=1m3u6MAyGQOjkGESPT84YzyS-quI-73o0-bj041SzAk,1
|
|
|
240
236
|
oscura/exploratory/recovery.py,sha256=7nqk5nU6M0nViCvy3JnhgD64YgPDik1mgIyGGVCOj3g,9638
|
|
241
237
|
oscura/exploratory/sync.py,sha256=6lcLt7GmZoRj9luZkNSjTRIuG7kTnxgONdBp0YSQKns,12610
|
|
242
238
|
oscura/exploratory/unknown.py,sha256=_gByru0b0BvKfZWH0m8DgXNC0dGVW-O_vBo7Jwe6-qE,21614
|
|
243
|
-
oscura/export/__init__.py,sha256=
|
|
244
|
-
oscura/export/
|
|
245
|
-
oscura/export/wireshark/README.md,sha256=44ji8SuD7o-PCNKCGZ9Y3NIoKKnwUrwx2ZgSSuMI_2E,7395
|
|
239
|
+
oscura/export/__init__.py,sha256=TVVAw5rmbmQSNed3VOD4Fy2mSknwaAzI-oCoLgPKhXI,770
|
|
240
|
+
oscura/export/wireshark/README.md,sha256=3UQGQA3fd0mK-OLOhfjZv1XzE_7bloKzP8toEvTP8GU,7728
|
|
246
241
|
oscura/export/wireshark/__init__.py,sha256=Int_19KSBJP8J78LfdibB0S6aDAfbQZJLMap6HZwWSc,1449
|
|
247
242
|
oscura/export/wireshark/generator.py,sha256=kCYtBxSyYdglriV3lcW2yfNBEYkfYV4K6oaegd3ulG0,10561
|
|
248
243
|
oscura/export/wireshark/lua_builder.py,sha256=8SqRivyzW0lzBY1O_oOhFt3vujL-CSgqBkhpU9kz_58,4533
|
|
@@ -254,12 +249,11 @@ oscura/exporters/csv.py,sha256=4LLnWWnbmhjSMCq4ayBe0EIK53mp2l0OcK_FBUnnv_4,9186
|
|
|
254
249
|
oscura/exporters/exporters.py,sha256=wJAr2R62dWk6YCiJcK3QyUa9fS3Au8UhZb4nsY7CQJI,899
|
|
255
250
|
oscura/exporters/hdf5.py,sha256=6YsXtqlkkjeqlg2wh_QjUf7jQMu0J3eCvVgxjX3lW8Y,5956
|
|
256
251
|
oscura/exporters/html_export.py,sha256=kdlPCOTJzriY88i6ufDe6HMYo3fKDilgQazL3nADFQY,19446
|
|
257
|
-
oscura/exporters/json_export.py,sha256=
|
|
252
|
+
oscura/exporters/json_export.py,sha256=n0tkVSlsNaEmch-cuEF3F0247RWYDqpaA07fzmrMDOM,8443
|
|
258
253
|
oscura/exporters/markdown_export.py,sha256=JdPDm9UmUcT6ikrDZvurdWGy0hXSUbjGjlMyUct8TpM,11957
|
|
259
254
|
oscura/exporters/matlab_export.py,sha256=YKAvPtFWj9-ISpN6cZu1s2wI0wNu_zKIrasZxh5ADnA,11003
|
|
260
255
|
oscura/exporters/npz_export.py,sha256=RMSZQH5M8C-ELoIVkQakcZ-ETQaOnnWJiHGEqcrtYVo,6063
|
|
261
256
|
oscura/exporters/spice_export.py,sha256=E0vkJ0AVxzzAOR4BX9afnGOfbltJQsIEWSumh1EZF9o,6515
|
|
262
|
-
oscura/exporters/vintage_logic_csv.py,sha256=CeiOkIcUe8MzPyIHQyIBrjMEDM0wAVJEBKx-Pbhr9ig,7405
|
|
263
257
|
oscura/extensibility/__init__.py,sha256=B2wrC7j-swzJkNdQwHS0lXr6FVBy3XWrwZ4dvtdt2gs,2955
|
|
264
258
|
oscura/extensibility/docs.py,sha256=BW5c-s-UvYmqkVoe7SidLw3I_FhzMhCeY--rE2pMex8,21738
|
|
265
259
|
oscura/extensibility/extensions.py,sha256=22QwZOS1D8KPKAQPnCIb9jRLwXi8fwCwqwPGcpeLTJI,38888
|
|
@@ -294,7 +288,7 @@ oscura/inference/signal_intelligence.py,sha256=inPsdnq47vxotdJt5PWP8ca_ecFuWFXit
|
|
|
294
288
|
oscura/inference/spectral.py,sha256=r2YTTD9x2vuz44inzr2BCcLrRaQqIRksfz4C0YgwAQY,7100
|
|
295
289
|
oscura/inference/state_machine.py,sha256=wNzjFivXOT_eE7hTCDAVBh8r8v2A4NQGUpYFH0C5vWk,19846
|
|
296
290
|
oscura/inference/stream.py,sha256=pzmbBAx03N9SP9sjtAzfx6iZHiIGsTISSyGhXny4MSs,29448
|
|
297
|
-
oscura/inference/active_learning/README.md,sha256=
|
|
291
|
+
oscura/inference/active_learning/README.md,sha256=h7yvXZNRS1NqL8Jdp0Dy-0M3ciUN9nZqBN11N-4xniw,4834
|
|
298
292
|
oscura/inference/active_learning/__init__.py,sha256=CEay1z0T0VxZnvSM7CM7xJZDdnODq3yU5eIkYFMGN5M,1353
|
|
299
293
|
oscura/inference/active_learning/lstar.py,sha256=fvR0XGnIO3lfZ7ho9ot_qL5OkAgaRIeEKcJZGJbswA4,8590
|
|
300
294
|
oscura/inference/active_learning/observation_table.py,sha256=T0MP5ePONYx_K8L2768zmxOiAtYXVSmizDDKrrJlFVQ,7632
|
|
@@ -339,7 +333,7 @@ oscura/optimization/parallel.py,sha256=30Qy-QDbDt0_cQisBMhbkIQ_adSLaPE8S2BxIo0o2
|
|
|
339
333
|
oscura/optimization/search.py,sha256=-rJQFlMVanCV3oXg35go8tZg5ywUhMYxbhiekEA5rxc,17241
|
|
340
334
|
oscura/pipeline/__init__.py,sha256=W1ObXXo0wn4pGkl8hPfxaElOSLK5b8pjZ-aRxwfksow,964
|
|
341
335
|
oscura/pipeline/base.py,sha256=2-6yXeucDoWf8HJAVXqocLxVcKcPBytyEfonKRarNX4,11353
|
|
342
|
-
oscura/pipeline/composition.py,sha256=
|
|
336
|
+
oscura/pipeline/composition.py,sha256=RF1LGcRMPXmR9TAJqMUO-h6OAl2iywtNFyCVBXv9bdU,7870
|
|
343
337
|
oscura/pipeline/parallel.py,sha256=cTEWq5Ele_EoWQr23OtV1YQVxsWBGM6hchmCwMYvZAk,16984
|
|
344
338
|
oscura/pipeline/pipeline.py,sha256=APEIDaapwVnoeBixkYo5VAtpFOsPh9GaOdMRr_j5ByU,13284
|
|
345
339
|
oscura/pipeline/reverse_engineering.py,sha256=hSPRkaEAnnR84X-ocXwmFRRDnL5iHtl9M_8OGd8kZVw,38590
|
|
@@ -357,7 +351,7 @@ oscura/quality/ensemble.py,sha256=okfIQmsypHqQTmBfd_uRXLKshs7E1DbU-jFGSBMQTCc,28
|
|
|
357
351
|
oscura/quality/explainer.py,sha256=2WIaetGgS1ivwJaJbanOMWWwNTqQhrrn2zemxCCwZII,10729
|
|
358
352
|
oscura/quality/scoring.py,sha256=gsIl-2164vGS1LcSP7x29D2hfKLPxee3mmuaFPwQ9Ko,19020
|
|
359
353
|
oscura/quality/warnings.py,sha256=qdnoe9qh0WJnupqgJzgkEzAZMOgDckGJXC9fKF36Rs8,13469
|
|
360
|
-
oscura/reporting/__init__.py,sha256=
|
|
354
|
+
oscura/reporting/__init__.py,sha256=b3w_Q-nmCNjn99eyLgVUHEDkzwzdYupx8lmlrpxS-eQ,6068
|
|
361
355
|
oscura/reporting/advanced.py,sha256=dcu2fjCA_a4R7lGhdUQbcAb7ioTg7lkUwDiQK4uopjM,36413
|
|
362
356
|
oscura/reporting/analyze.py,sha256=7tjXGsi3nWyX9I4Tw9nSX6BHD5E7Mu3tpuZAQi2S2hQ,14612
|
|
363
357
|
oscura/reporting/argument_preparer.py,sha256=L0FB0EGmUyP-GjTgEncvkpVbWMrbncoHTiBIOR5avUo,24095
|
|
@@ -382,7 +376,6 @@ oscura/reporting/standards.py,sha256=nC3wOZThj6IMCRpdE9HL8mwcvArRwzhkX92yHox2-qo
|
|
|
382
376
|
oscura/reporting/summary_generator.py,sha256=GOPVUCNNZPFn8aVM9YCqFG-wkCTFhRZt--kIyRkOzX4,10622
|
|
383
377
|
oscura/reporting/tables.py,sha256=VlUAwqv9sPGyj-1A93nCpP-JhYs5TunaJX2oNzHgVcw,11622
|
|
384
378
|
oscura/reporting/template_system.py,sha256=jPF5jkkjl8el8V6IGJGNZmPlNRFZd0_DBbcokOUMiTU,21135
|
|
385
|
-
oscura/reporting/vintage_logic_report.py,sha256=-RyYYEKhP1f6yyhJ41fCkaZHw-nUcSd_CWd-jFgXxDw,15111
|
|
386
379
|
oscura/reporting/content/__init__.py,sha256=MIU1IrYdFy7L7d6CY8RxkzL1_wL1qLYUfzUsKaASgJ4,874
|
|
387
380
|
oscura/reporting/content/executive.py,sha256=AQlQMPRLy2rPwPs6Y7somVeg8USIhlPGouYZlMq5rOA,4255
|
|
388
381
|
oscura/reporting/content/filtering.py,sha256=JrSPJPyGw_jsZUWlAi-ELt8b2ybh1Ui_wXWULv0R-ng,5184
|
|
@@ -399,8 +392,12 @@ oscura/reporting/renderers/pdf.py,sha256=EYJyXQRPuSFIDl-6M55UvxOG4HKlKAQ-_SypvZp
|
|
|
399
392
|
oscura/reporting/templates/__init__.py,sha256=Snm9Ygw2EIe4DnDAxHcu5NIYLCEVeoZjyw8MDmrcWLM,301
|
|
400
393
|
oscura/reporting/templates/definition.py,sha256=KC--ESq6Ja9OA_hC3uVP3--Y_rhUEIUnm_1QJDIg7nQ,5204
|
|
401
394
|
oscura/reporting/templates/index.html,sha256=V74N-0erqnu8tevVFjPT-zMXi5M-7RSvTfujW9pwQPQ,16007
|
|
402
|
-
oscura/reporting/templates/index.md,sha256=
|
|
395
|
+
oscura/reporting/templates/index.md,sha256=HJANTLpIw7pB6xvTZzAKlM3FWVCpyJtLlA7hjKnMqM0,3754
|
|
403
396
|
oscura/schemas/__init__.py,sha256=0zVM3hatGgl3onywiWNia8ov0TJ-tFqXz_cBzuZW7nU,4317
|
|
397
|
+
oscura/schemas/bus_configuration.json,sha256=gpcDsg04760KCaLeIDuWvP6RzRUcPZuQplJbe7xpc8E,9562
|
|
398
|
+
oscura/schemas/device_mapping.json,sha256=sYOcc2zSe0rmMQN_vtg3Y5XeeDMktAO1ar8vAWl-E1M,5499
|
|
399
|
+
oscura/schemas/packet_format.json,sha256=y2KavMGeOUlmjDq7AW_85bfTk3nHlGPuistpuVDdlAk,12893
|
|
400
|
+
oscura/schemas/protocol_definition.json,sha256=VPHkgY4fAI-hUiRBtiqZvDNUGjp6_7O4xdi1z36IhCI,11256
|
|
404
401
|
oscura/search/__init__.py,sha256=eoX7yKNILdlmlFCpt-QHVuT2dUGw6m2GMYrQv5w-mhc,413
|
|
405
402
|
oscura/search/anomaly.py,sha256=JHcnB9Ba6Hk93vpYedj2Olv6_L_3xnOg8mn6UEyoE6A,9805
|
|
406
403
|
oscura/search/context.py,sha256=vJ4lWXcC3R7N0vTyTorsZa3KkFLHkd6vQpmhmMeSEIQ,4857
|
|
@@ -429,7 +426,7 @@ oscura/ui/__init__.py,sha256=BT4w05Hd7Tg2dM_00cs3G4RJQnj0a56o9uf-41FV7cs,919
|
|
|
429
426
|
oscura/ui/formatters.py,sha256=34Wjz1r4FsaGrzdcjltOAyDIvWAjji1wTJaSYn1QYBo,13650
|
|
430
427
|
oscura/ui/progressive_display.py,sha256=LKGRJrSAscdoUKrBhKZzpYJlnNBX-kOTUGmJCsufFSI,10314
|
|
431
428
|
oscura/utils/__init__.py,sha256=GaasTJFnZBru-vBPiZQaoGZq65x5ys9trDaIQWuclWc,2270
|
|
432
|
-
oscura/utils/autodetect.py,sha256=
|
|
429
|
+
oscura/utils/autodetect.py,sha256=cP-_be6XK9neO28J2le1iZ8YLvPmfpc8L-p6KAlA6h8,9324
|
|
433
430
|
oscura/utils/buffer.py,sha256=H-lKT0MBe0fqMoX5UCYftFUaadhSF_Ydwrf7VL8KBy8,10327
|
|
434
431
|
oscura/utils/lazy.py,sha256=tUy9oZGGjulS4raEbuKvUcdnToCO1y3hKxisCxY1Xm0,11825
|
|
435
432
|
oscura/utils/lazy_imports.py,sha256=GA1yAu3CowOGmsTmNnh42d2afP6DtG6o-6u2iJe85G8,3990
|
|
@@ -444,9 +441,7 @@ oscura/visualization/annotations.py,sha256=01ieilFN6CmmzrMzyWF_G9IR5I7W6XKW-5hTT
|
|
|
444
441
|
oscura/visualization/axis_scaling.py,sha256=19TSQgF5s0I2GSFdLNazwjtMdACBB7fDJwUyDtFCSuc,9300
|
|
445
442
|
oscura/visualization/colors.py,sha256=nw8h4u8lSN8Oq9sqJuKOmrlC8tOcnuvF8xYtP2LvZso,12046
|
|
446
443
|
oscura/visualization/digital.py,sha256=ChKrsQu6z9ZVoMmTdxWhkNu6B7od0SEtZ1fVq_y9ts0,10096
|
|
447
|
-
oscura/visualization/digital_advanced.py,sha256=9wMpDNtpDqHy2uZaP32NM7MMQfly5v4nqK5oHXQJ33U,22836
|
|
448
444
|
oscura/visualization/eye.py,sha256=rqv34ZtVE58bZUlUrO__5Cgps-PT-HeGbjPI6CrbEcg,12848
|
|
449
|
-
oscura/visualization/figure_manager.py,sha256=dG0xsvGVBBomaZPprogGHR2TG3DdK75u72agn8gwu_Q,4495
|
|
450
445
|
oscura/visualization/histogram.py,sha256=8MYLV9i3XufDChvo27BuruTRR2pOIUN592fqNsjC9jM,7068
|
|
451
446
|
oscura/visualization/interactive.py,sha256=KRSsBngArbs5LNZgzVQlMSLJPLvmG5u-ScSj43wvKRQ,25462
|
|
452
447
|
oscura/visualization/jitter.py,sha256=Zib_cShNShvH9qZT8crZHTsMk5hmGc2a7qgO2vvwEco,20526
|
|
@@ -479,8 +474,8 @@ oscura/workflows/power.py,sha256=fpTzoIfuZi69ldtu2KAHW-Qu6jzA5jBa_9LVy6xqpTI,608
|
|
|
479
474
|
oscura/workflows/protocol.py,sha256=x3T-M81vFVrW3mouaYA8WjxyLLzZyLATVJbiqcMAVFQ,15275
|
|
480
475
|
oscura/workflows/reverse_engineering.py,sha256=K_yrqrQqQNcCoB0jRAG92e2zy8er3oiKJWSF6lU4nGk,19929
|
|
481
476
|
oscura/workflows/signal_integrity.py,sha256=p-DOC-AhzQOkG_jyyBK3EUaIBAGZhAhdmo-Ub_ifC3U,8391
|
|
482
|
-
oscura-0.5.
|
|
483
|
-
oscura-0.5.
|
|
484
|
-
oscura-0.5.
|
|
485
|
-
oscura-0.5.
|
|
486
|
-
oscura-0.5.
|
|
477
|
+
oscura-0.5.1.dist-info/METADATA,sha256=hnDRI0G8XD3TZZj6UBcr-f1FSWT_wgMeguPzUuyczvU,38933
|
|
478
|
+
oscura-0.5.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
479
|
+
oscura-0.5.1.dist-info/entry_points.txt,sha256=QLBxd-iTjBQ5HidaVSkLBwvUsqxSG1ZTJ6i-0juu960,48
|
|
480
|
+
oscura-0.5.1.dist-info/licenses/LICENSE,sha256=p1_oEK-oqWDXMFSv5mKbyYkgW-CPbCnFUvdICu490aY,1077
|
|
481
|
+
oscura-0.5.1.dist-info/RECORD,,
|
|
@@ -1,498 +0,0 @@
|
|
|
1
|
-
"""IC timing database for vintage and modern logic ICs.
|
|
2
|
-
|
|
3
|
-
This module provides timing specifications for common ICs to enable automatic
|
|
4
|
-
validation and identification.
|
|
5
|
-
|
|
6
|
-
Example:
|
|
7
|
-
>>> from oscura.analyzers.digital.ic_database import IC_DATABASE, identify_ic
|
|
8
|
-
>>> spec = IC_DATABASE["74LS74"]
|
|
9
|
-
>>> print(f"Setup time: {spec.timing['t_su']*1e9:.1f}ns")
|
|
10
|
-
>>>
|
|
11
|
-
>>> # Auto-identify IC from measurements
|
|
12
|
-
>>> ic_name, conf = identify_ic(measured_timings)
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
from __future__ import annotations
|
|
16
|
-
|
|
17
|
-
from dataclasses import dataclass, field
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class ICTiming:
|
|
22
|
-
"""Timing specification for an IC.
|
|
23
|
-
|
|
24
|
-
Attributes:
|
|
25
|
-
part_number: IC part number (e.g., "74LS74").
|
|
26
|
-
description: Brief description of function.
|
|
27
|
-
family: Logic family (e.g., "TTL", "LS-TTL", "HC-CMOS").
|
|
28
|
-
vcc_nom: Nominal supply voltage.
|
|
29
|
-
vcc_range: Supply voltage range (min, max).
|
|
30
|
-
timing: Dictionary of timing parameters in seconds.
|
|
31
|
-
voltage_levels: Dictionary of voltage thresholds.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
part_number: str
|
|
35
|
-
description: str
|
|
36
|
-
family: str
|
|
37
|
-
vcc_nom: float
|
|
38
|
-
vcc_range: tuple[float, float]
|
|
39
|
-
timing: dict[str, float] = field(default_factory=dict)
|
|
40
|
-
voltage_levels: dict[str, float] = field(default_factory=dict)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
# Timing parameter definitions:
|
|
44
|
-
# t_pd: Propagation delay
|
|
45
|
-
# t_su: Setup time
|
|
46
|
-
# t_h: Hold time
|
|
47
|
-
# t_w: Pulse width (minimum)
|
|
48
|
-
# t_r: Rise time
|
|
49
|
-
# t_f: Fall time
|
|
50
|
-
# t_co: Clock-to-output delay
|
|
51
|
-
|
|
52
|
-
# 74xx TTL Series (Standard TTL - 1970s era)
|
|
53
|
-
IC_7400_STD = ICTiming(
|
|
54
|
-
part_number="7400",
|
|
55
|
-
description="Quad 2-input NAND gate",
|
|
56
|
-
family="TTL",
|
|
57
|
-
vcc_nom=5.0,
|
|
58
|
-
vcc_range=(4.75, 5.25),
|
|
59
|
-
timing={
|
|
60
|
-
"t_pd": 22e-9, # Typ 22ns, max 33ns
|
|
61
|
-
"t_r": 12e-9,
|
|
62
|
-
"t_f": 8e-9,
|
|
63
|
-
},
|
|
64
|
-
voltage_levels={
|
|
65
|
-
"VIL_max": 0.8,
|
|
66
|
-
"VIH_min": 2.0,
|
|
67
|
-
"VOL_max": 0.4,
|
|
68
|
-
"VOH_min": 2.4,
|
|
69
|
-
},
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
IC_7474_STD = ICTiming(
|
|
73
|
-
part_number="7474",
|
|
74
|
-
description="Dual D-type flip-flop",
|
|
75
|
-
family="TTL",
|
|
76
|
-
vcc_nom=5.0,
|
|
77
|
-
vcc_range=(4.75, 5.25),
|
|
78
|
-
timing={
|
|
79
|
-
"t_pd": 25e-9, # Clock-to-output
|
|
80
|
-
"t_su": 20e-9, # Setup time
|
|
81
|
-
"t_h": 5e-9, # Hold time
|
|
82
|
-
"t_w": 25e-9, # Minimum clock pulse width
|
|
83
|
-
"t_r": 12e-9,
|
|
84
|
-
"t_f": 8e-9,
|
|
85
|
-
},
|
|
86
|
-
voltage_levels={
|
|
87
|
-
"VIL_max": 0.8,
|
|
88
|
-
"VIH_min": 2.0,
|
|
89
|
-
"VOL_max": 0.4,
|
|
90
|
-
"VOH_min": 2.4,
|
|
91
|
-
},
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
# 74LSxx Low-Power Schottky TTL Series (1970s-1980s)
|
|
95
|
-
IC_74LS00 = ICTiming(
|
|
96
|
-
part_number="74LS00",
|
|
97
|
-
description="Quad 2-input NAND gate",
|
|
98
|
-
family="LS-TTL",
|
|
99
|
-
vcc_nom=5.0,
|
|
100
|
-
vcc_range=(4.75, 5.25),
|
|
101
|
-
timing={
|
|
102
|
-
"t_pd": 10e-9, # Typ 10ns, max 15ns
|
|
103
|
-
"t_r": 10e-9,
|
|
104
|
-
"t_f": 7e-9,
|
|
105
|
-
},
|
|
106
|
-
voltage_levels={
|
|
107
|
-
"VIL_max": 0.8,
|
|
108
|
-
"VIH_min": 2.0,
|
|
109
|
-
"VOL_max": 0.5,
|
|
110
|
-
"VOH_min": 2.7,
|
|
111
|
-
},
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
IC_74LS74 = ICTiming(
|
|
115
|
-
part_number="74LS74",
|
|
116
|
-
description="Dual D-type flip-flop",
|
|
117
|
-
family="LS-TTL",
|
|
118
|
-
vcc_nom=5.0,
|
|
119
|
-
vcc_range=(4.75, 5.25),
|
|
120
|
-
timing={
|
|
121
|
-
"t_pd": 25e-9, # Clock-to-output (typ), max 40ns
|
|
122
|
-
"t_su": 20e-9, # Setup time
|
|
123
|
-
"t_h": 5e-9, # Hold time
|
|
124
|
-
"t_w": 25e-9, # Min clock pulse width
|
|
125
|
-
"t_r": 10e-9,
|
|
126
|
-
"t_f": 7e-9,
|
|
127
|
-
},
|
|
128
|
-
voltage_levels={
|
|
129
|
-
"VIL_max": 0.8,
|
|
130
|
-
"VIH_min": 2.0,
|
|
131
|
-
"VOL_max": 0.5,
|
|
132
|
-
"VOH_min": 2.7,
|
|
133
|
-
},
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
IC_74LS244 = ICTiming(
|
|
137
|
-
part_number="74LS244",
|
|
138
|
-
description="Octal buffer/line driver",
|
|
139
|
-
family="LS-TTL",
|
|
140
|
-
vcc_nom=5.0,
|
|
141
|
-
vcc_range=(4.75, 5.25),
|
|
142
|
-
timing={
|
|
143
|
-
"t_pd": 12e-9, # Typ 12ns, max 18ns
|
|
144
|
-
"t_r": 7e-9,
|
|
145
|
-
"t_f": 5e-9,
|
|
146
|
-
},
|
|
147
|
-
voltage_levels={
|
|
148
|
-
"VIL_max": 0.8,
|
|
149
|
-
"VIH_min": 2.0,
|
|
150
|
-
"VOL_max": 0.5,
|
|
151
|
-
"VOH_min": 2.7,
|
|
152
|
-
},
|
|
153
|
-
)
|
|
154
|
-
|
|
155
|
-
IC_74LS245 = ICTiming(
|
|
156
|
-
part_number="74LS245",
|
|
157
|
-
description="Octal bus transceiver",
|
|
158
|
-
family="LS-TTL",
|
|
159
|
-
vcc_nom=5.0,
|
|
160
|
-
vcc_range=(4.75, 5.25),
|
|
161
|
-
timing={
|
|
162
|
-
"t_pd": 12e-9, # Typ 12ns, max 18ns
|
|
163
|
-
"t_r": 7e-9,
|
|
164
|
-
"t_f": 5e-9,
|
|
165
|
-
},
|
|
166
|
-
voltage_levels={
|
|
167
|
-
"VIL_max": 0.8,
|
|
168
|
-
"VIH_min": 2.0,
|
|
169
|
-
"VOL_max": 0.5,
|
|
170
|
-
"VOH_min": 2.7,
|
|
171
|
-
},
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
IC_74LS138 = ICTiming(
|
|
175
|
-
part_number="74LS138",
|
|
176
|
-
description="3-to-8 line decoder/demultiplexer",
|
|
177
|
-
family="LS-TTL",
|
|
178
|
-
vcc_nom=5.0,
|
|
179
|
-
vcc_range=(4.75, 5.25),
|
|
180
|
-
timing={
|
|
181
|
-
"t_pd": 21e-9, # Typ 21ns, max 41ns
|
|
182
|
-
"t_r": 10e-9,
|
|
183
|
-
"t_f": 7e-9,
|
|
184
|
-
},
|
|
185
|
-
voltage_levels={
|
|
186
|
-
"VIL_max": 0.8,
|
|
187
|
-
"VIH_min": 2.0,
|
|
188
|
-
"VOL_max": 0.5,
|
|
189
|
-
"VOH_min": 2.7,
|
|
190
|
-
},
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
IC_74LS273 = ICTiming(
|
|
194
|
-
part_number="74LS273",
|
|
195
|
-
description="Octal D-type flip-flop with clear",
|
|
196
|
-
family="LS-TTL",
|
|
197
|
-
vcc_nom=5.0,
|
|
198
|
-
vcc_range=(4.75, 5.25),
|
|
199
|
-
timing={
|
|
200
|
-
"t_pd": 20e-9, # Clock-to-output
|
|
201
|
-
"t_su": 20e-9, # Setup time
|
|
202
|
-
"t_h": 5e-9, # Hold time
|
|
203
|
-
"t_w": 20e-9, # Min clock pulse width
|
|
204
|
-
"t_r": 10e-9,
|
|
205
|
-
"t_f": 7e-9,
|
|
206
|
-
},
|
|
207
|
-
voltage_levels={
|
|
208
|
-
"VIL_max": 0.8,
|
|
209
|
-
"VIH_min": 2.0,
|
|
210
|
-
"VOL_max": 0.5,
|
|
211
|
-
"VOH_min": 2.7,
|
|
212
|
-
},
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
IC_74LS374 = ICTiming(
|
|
216
|
-
part_number="74LS374",
|
|
217
|
-
description="Octal D-type flip-flop with 3-state outputs",
|
|
218
|
-
family="LS-TTL",
|
|
219
|
-
vcc_nom=5.0,
|
|
220
|
-
vcc_range=(4.75, 5.25),
|
|
221
|
-
timing={
|
|
222
|
-
"t_pd": 20e-9, # Clock-to-output
|
|
223
|
-
"t_su": 20e-9, # Setup time
|
|
224
|
-
"t_h": 5e-9, # Hold time
|
|
225
|
-
"t_w": 20e-9, # Min clock pulse width
|
|
226
|
-
"t_pz": 18e-9, # Output enable to output
|
|
227
|
-
"t_pzh": 30e-9, # Output disable to high-Z
|
|
228
|
-
"t_r": 10e-9,
|
|
229
|
-
"t_f": 7e-9,
|
|
230
|
-
},
|
|
231
|
-
voltage_levels={
|
|
232
|
-
"VIL_max": 0.8,
|
|
233
|
-
"VIH_min": 2.0,
|
|
234
|
-
"VOL_max": 0.5,
|
|
235
|
-
"VOH_min": 2.7,
|
|
236
|
-
},
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
# 74HCxx High-Speed CMOS Series (1980s-present)
|
|
240
|
-
IC_74HC00 = ICTiming(
|
|
241
|
-
part_number="74HC00",
|
|
242
|
-
description="Quad 2-input NAND gate",
|
|
243
|
-
family="HC-CMOS",
|
|
244
|
-
vcc_nom=5.0,
|
|
245
|
-
vcc_range=(2.0, 6.0),
|
|
246
|
-
timing={
|
|
247
|
-
"t_pd": 8e-9, # At 5V, typ 8ns
|
|
248
|
-
"t_r": 6e-9,
|
|
249
|
-
"t_f": 6e-9,
|
|
250
|
-
},
|
|
251
|
-
voltage_levels={
|
|
252
|
-
"VIL_max": 1.35,
|
|
253
|
-
"VIH_min": 3.15,
|
|
254
|
-
"VOL_max": 0.33,
|
|
255
|
-
"VOH_min": 3.84,
|
|
256
|
-
},
|
|
257
|
-
)
|
|
258
|
-
|
|
259
|
-
IC_74HC74 = ICTiming(
|
|
260
|
-
part_number="74HC74",
|
|
261
|
-
description="Dual D-type flip-flop",
|
|
262
|
-
family="HC-CMOS",
|
|
263
|
-
vcc_nom=5.0,
|
|
264
|
-
vcc_range=(2.0, 6.0),
|
|
265
|
-
timing={
|
|
266
|
-
"t_pd": 16e-9, # Clock-to-output at 5V
|
|
267
|
-
"t_su": 14e-9, # Setup time
|
|
268
|
-
"t_h": 3e-9, # Hold time
|
|
269
|
-
"t_w": 14e-9, # Min clock pulse width
|
|
270
|
-
"t_r": 6e-9,
|
|
271
|
-
"t_f": 6e-9,
|
|
272
|
-
},
|
|
273
|
-
voltage_levels={
|
|
274
|
-
"VIL_max": 1.35,
|
|
275
|
-
"VIH_min": 3.15,
|
|
276
|
-
"VOL_max": 0.33,
|
|
277
|
-
"VOH_min": 3.84,
|
|
278
|
-
},
|
|
279
|
-
)
|
|
280
|
-
|
|
281
|
-
IC_74HC595 = ICTiming(
|
|
282
|
-
part_number="74HC595",
|
|
283
|
-
description="8-bit shift register with output latches",
|
|
284
|
-
family="HC-CMOS",
|
|
285
|
-
vcc_nom=5.0,
|
|
286
|
-
vcc_range=(2.0, 6.0),
|
|
287
|
-
timing={
|
|
288
|
-
"t_pd": 16e-9, # Clock-to-output
|
|
289
|
-
"t_su": 14e-9, # Setup time
|
|
290
|
-
"t_h": 3e-9, # Hold time
|
|
291
|
-
"t_w": 14e-9, # Min clock pulse width
|
|
292
|
-
"t_r": 6e-9,
|
|
293
|
-
"t_f": 6e-9,
|
|
294
|
-
},
|
|
295
|
-
voltage_levels={
|
|
296
|
-
"VIL_max": 1.35,
|
|
297
|
-
"VIH_min": 3.15,
|
|
298
|
-
"VOL_max": 0.33,
|
|
299
|
-
"VOH_min": 3.84,
|
|
300
|
-
},
|
|
301
|
-
)
|
|
302
|
-
|
|
303
|
-
# 4000 Series CMOS (1970s-1980s)
|
|
304
|
-
IC_4011 = ICTiming(
|
|
305
|
-
part_number="4011",
|
|
306
|
-
description="Quad 2-input NAND gate",
|
|
307
|
-
family="CMOS_5V",
|
|
308
|
-
vcc_nom=5.0,
|
|
309
|
-
vcc_range=(3.0, 18.0),
|
|
310
|
-
timing={
|
|
311
|
-
"t_pd": 90e-9, # At 5V, typ 90ns
|
|
312
|
-
"t_r": 60e-9,
|
|
313
|
-
"t_f": 60e-9,
|
|
314
|
-
},
|
|
315
|
-
voltage_levels={
|
|
316
|
-
"VIL_max": 1.5,
|
|
317
|
-
"VIH_min": 3.5,
|
|
318
|
-
"VOL_max": 0.05,
|
|
319
|
-
"VOH_min": 4.95,
|
|
320
|
-
},
|
|
321
|
-
)
|
|
322
|
-
|
|
323
|
-
IC_4013 = ICTiming(
|
|
324
|
-
part_number="4013",
|
|
325
|
-
description="Dual D-type flip-flop",
|
|
326
|
-
family="CMOS_5V",
|
|
327
|
-
vcc_nom=5.0,
|
|
328
|
-
vcc_range=(3.0, 18.0),
|
|
329
|
-
timing={
|
|
330
|
-
"t_pd": 140e-9, # Clock-to-output at 5V
|
|
331
|
-
"t_su": 60e-9, # Setup time
|
|
332
|
-
"t_h": 40e-9, # Hold time
|
|
333
|
-
"t_w": 100e-9, # Min clock pulse width
|
|
334
|
-
"t_r": 60e-9,
|
|
335
|
-
"t_f": 60e-9,
|
|
336
|
-
},
|
|
337
|
-
voltage_levels={
|
|
338
|
-
"VIL_max": 1.5,
|
|
339
|
-
"VIH_min": 3.5,
|
|
340
|
-
"VOL_max": 0.05,
|
|
341
|
-
"VOH_min": 4.95,
|
|
342
|
-
},
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
# Comprehensive IC database
|
|
346
|
-
IC_DATABASE: dict[str, ICTiming] = {
|
|
347
|
-
# Standard TTL
|
|
348
|
-
"7400": IC_7400_STD,
|
|
349
|
-
# LS-TTL (74LS series preferred over 74 for specificity)
|
|
350
|
-
"74LS00": IC_74LS00,
|
|
351
|
-
"74LS74": IC_74LS74,
|
|
352
|
-
"74LS138": IC_74LS138,
|
|
353
|
-
"74LS244": IC_74LS244,
|
|
354
|
-
"74LS245": IC_74LS245,
|
|
355
|
-
"74LS273": IC_74LS273,
|
|
356
|
-
"74LS374": IC_74LS374,
|
|
357
|
-
# HC-CMOS
|
|
358
|
-
"74HC00": IC_74HC00,
|
|
359
|
-
"74HC74": IC_74HC74,
|
|
360
|
-
"74HC595": IC_74HC595,
|
|
361
|
-
# 4000 series CMOS
|
|
362
|
-
"4011": IC_4011,
|
|
363
|
-
"4013": IC_4013,
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
def identify_ic(
|
|
368
|
-
measured_timings: dict[str, float],
|
|
369
|
-
*,
|
|
370
|
-
tolerance: float = 0.5,
|
|
371
|
-
min_confidence: float = 0.6,
|
|
372
|
-
) -> tuple[str, float]:
|
|
373
|
-
"""Identify IC from measured timing parameters.
|
|
374
|
-
|
|
375
|
-
Args:
|
|
376
|
-
measured_timings: Dictionary of measured timing values (e.g., {'t_pd': 25e-9}).
|
|
377
|
-
tolerance: Allowable deviation (0.0-1.0, 0.5 = 50% tolerance).
|
|
378
|
-
min_confidence: Minimum confidence score (0.0-1.0).
|
|
379
|
-
|
|
380
|
-
Returns:
|
|
381
|
-
Tuple of (ic_name, confidence_score).
|
|
382
|
-
Returns ("unknown", 0.0) if no match above min_confidence.
|
|
383
|
-
|
|
384
|
-
Example:
|
|
385
|
-
>>> timings = {'t_pd': 25e-9, 't_su': 20e-9, 't_h': 5e-9}
|
|
386
|
-
>>> ic, conf = identify_ic(timings)
|
|
387
|
-
>>> print(f"Identified: {ic} ({conf*100:.1f}% confidence)")
|
|
388
|
-
"""
|
|
389
|
-
scores: dict[str, float] = {}
|
|
390
|
-
|
|
391
|
-
for ic_name, ic_spec in IC_DATABASE.items():
|
|
392
|
-
# Calculate match score for this IC
|
|
393
|
-
param_scores = []
|
|
394
|
-
|
|
395
|
-
for param, measured_value in measured_timings.items():
|
|
396
|
-
if param not in ic_spec.timing:
|
|
397
|
-
continue
|
|
398
|
-
|
|
399
|
-
spec_value = ic_spec.timing[param]
|
|
400
|
-
|
|
401
|
-
# Calculate relative error
|
|
402
|
-
if spec_value == 0:
|
|
403
|
-
continue
|
|
404
|
-
|
|
405
|
-
error = abs(measured_value - spec_value) / spec_value
|
|
406
|
-
|
|
407
|
-
# Score based on error (within tolerance gets high score)
|
|
408
|
-
if error <= tolerance:
|
|
409
|
-
param_score = 1.0 - (error / tolerance)
|
|
410
|
-
else:
|
|
411
|
-
param_score = 0.0
|
|
412
|
-
|
|
413
|
-
param_scores.append(param_score)
|
|
414
|
-
|
|
415
|
-
# Overall score is average of parameter scores
|
|
416
|
-
if param_scores:
|
|
417
|
-
scores[ic_name] = sum(param_scores) / len(param_scores)
|
|
418
|
-
|
|
419
|
-
# Find best match
|
|
420
|
-
if not scores:
|
|
421
|
-
return ("unknown", 0.0)
|
|
422
|
-
|
|
423
|
-
best_ic = max(scores.items(), key=lambda x: x[1])
|
|
424
|
-
|
|
425
|
-
if best_ic[1] < min_confidence:
|
|
426
|
-
return ("unknown", best_ic[1])
|
|
427
|
-
|
|
428
|
-
return best_ic
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
def validate_ic_timing(
|
|
432
|
-
ic_name: str,
|
|
433
|
-
measured_timings: dict[str, float],
|
|
434
|
-
*,
|
|
435
|
-
tolerance: float = 0.3,
|
|
436
|
-
) -> dict[str, dict[str, float | bool | None]]:
|
|
437
|
-
"""Validate measured timings against IC specification.
|
|
438
|
-
|
|
439
|
-
Args:
|
|
440
|
-
ic_name: IC part number (e.g., "74LS74").
|
|
441
|
-
measured_timings: Dictionary of measured timing values.
|
|
442
|
-
tolerance: Allowable deviation (0.0-1.0).
|
|
443
|
-
|
|
444
|
-
Returns:
|
|
445
|
-
Dictionary mapping parameter names to validation results:
|
|
446
|
-
{'t_pd': {'measured': 25e-9, 'spec': 25e-9, 'passes': True, 'error': 0.0}}
|
|
447
|
-
|
|
448
|
-
Raises:
|
|
449
|
-
KeyError: If IC not found in database.
|
|
450
|
-
|
|
451
|
-
Example:
|
|
452
|
-
>>> results = validate_ic_timing("74LS74", {'t_pd': 30e-9})
|
|
453
|
-
>>> if not results['t_pd']['passes']:
|
|
454
|
-
... print(f"Propagation delay out of spec!")
|
|
455
|
-
"""
|
|
456
|
-
if ic_name not in IC_DATABASE:
|
|
457
|
-
raise KeyError(f"IC '{ic_name}' not found in database")
|
|
458
|
-
|
|
459
|
-
ic_spec = IC_DATABASE[ic_name]
|
|
460
|
-
results: dict[str, dict[str, float | bool | None]] = {}
|
|
461
|
-
|
|
462
|
-
for param, measured_value in measured_timings.items():
|
|
463
|
-
if param not in ic_spec.timing:
|
|
464
|
-
results[param] = {
|
|
465
|
-
"measured": measured_value,
|
|
466
|
-
"spec": None,
|
|
467
|
-
"passes": None,
|
|
468
|
-
"error": None,
|
|
469
|
-
}
|
|
470
|
-
continue
|
|
471
|
-
|
|
472
|
-
spec_value = ic_spec.timing[param]
|
|
473
|
-
|
|
474
|
-
# Calculate relative error
|
|
475
|
-
if spec_value == 0:
|
|
476
|
-
error = 0.0
|
|
477
|
-
else:
|
|
478
|
-
error = abs(measured_value - spec_value) / spec_value
|
|
479
|
-
|
|
480
|
-
# Check if within tolerance
|
|
481
|
-
passes = error <= tolerance
|
|
482
|
-
|
|
483
|
-
results[param] = {
|
|
484
|
-
"measured": measured_value,
|
|
485
|
-
"spec": spec_value,
|
|
486
|
-
"passes": passes,
|
|
487
|
-
"error": error,
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
return results
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
__all__ = [
|
|
494
|
-
"IC_DATABASE",
|
|
495
|
-
"ICTiming",
|
|
496
|
-
"identify_ic",
|
|
497
|
-
"validate_ic_timing",
|
|
498
|
-
]
|