da4ml 0.5.1.post1__cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.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.
Files changed (96) hide show
  1. da4ml/__init__.py +4 -0
  2. da4ml/_binary/__init__.py +15 -0
  3. da4ml/_binary/dais_bin.cpython-311-x86_64-linux-gnu.so +0 -0
  4. da4ml/_binary/dais_bin.pyi +5 -0
  5. da4ml/_cli/__init__.py +30 -0
  6. da4ml/_cli/convert.py +204 -0
  7. da4ml/_cli/report.py +295 -0
  8. da4ml/_version.py +32 -0
  9. da4ml/cmvm/__init__.py +4 -0
  10. da4ml/cmvm/api.py +264 -0
  11. da4ml/cmvm/core/__init__.py +221 -0
  12. da4ml/cmvm/core/indexers.py +83 -0
  13. da4ml/cmvm/core/state_opr.py +284 -0
  14. da4ml/cmvm/types.py +739 -0
  15. da4ml/cmvm/util/__init__.py +7 -0
  16. da4ml/cmvm/util/bit_decompose.py +86 -0
  17. da4ml/cmvm/util/mat_decompose.py +121 -0
  18. da4ml/codegen/__init__.py +9 -0
  19. da4ml/codegen/hls/__init__.py +4 -0
  20. da4ml/codegen/hls/hls_codegen.py +196 -0
  21. da4ml/codegen/hls/hls_model.py +255 -0
  22. da4ml/codegen/hls/source/ap_types/ap_binary.h +78 -0
  23. da4ml/codegen/hls/source/ap_types/ap_common.h +376 -0
  24. da4ml/codegen/hls/source/ap_types/ap_decl.h +212 -0
  25. da4ml/codegen/hls/source/ap_types/ap_fixed.h +360 -0
  26. da4ml/codegen/hls/source/ap_types/ap_fixed_base.h +2354 -0
  27. da4ml/codegen/hls/source/ap_types/ap_fixed_ref.h +718 -0
  28. da4ml/codegen/hls/source/ap_types/ap_fixed_special.h +230 -0
  29. da4ml/codegen/hls/source/ap_types/ap_int.h +330 -0
  30. da4ml/codegen/hls/source/ap_types/ap_int_base.h +1885 -0
  31. da4ml/codegen/hls/source/ap_types/ap_int_ref.h +1346 -0
  32. da4ml/codegen/hls/source/ap_types/ap_int_special.h +223 -0
  33. da4ml/codegen/hls/source/ap_types/ap_shift_reg.h +138 -0
  34. da4ml/codegen/hls/source/ap_types/etc/ap_private.h +7199 -0
  35. da4ml/codegen/hls/source/ap_types/hls_math.h +27 -0
  36. da4ml/codegen/hls/source/ap_types/hls_stream.h +263 -0
  37. da4ml/codegen/hls/source/ap_types/utils/x_hls_utils.h +80 -0
  38. da4ml/codegen/hls/source/binder_util.hh +71 -0
  39. da4ml/codegen/hls/source/build_binder.mk +22 -0
  40. da4ml/codegen/hls/source/vitis_bitshift.hh +32 -0
  41. da4ml/codegen/rtl/__init__.py +15 -0
  42. da4ml/codegen/rtl/common_source/binder_util.hh +99 -0
  43. da4ml/codegen/rtl/common_source/build_binder.mk +34 -0
  44. da4ml/codegen/rtl/common_source/build_quartus_prj.tcl +104 -0
  45. da4ml/codegen/rtl/common_source/build_vivado_prj.tcl +111 -0
  46. da4ml/codegen/rtl/common_source/ioutil.hh +124 -0
  47. da4ml/codegen/rtl/common_source/template.sdc +27 -0
  48. da4ml/codegen/rtl/common_source/template.xdc +30 -0
  49. da4ml/codegen/rtl/rtl_model.py +486 -0
  50. da4ml/codegen/rtl/verilog/__init__.py +10 -0
  51. da4ml/codegen/rtl/verilog/comb.py +239 -0
  52. da4ml/codegen/rtl/verilog/io_wrapper.py +113 -0
  53. da4ml/codegen/rtl/verilog/pipeline.py +67 -0
  54. da4ml/codegen/rtl/verilog/source/lookup_table.v +27 -0
  55. da4ml/codegen/rtl/verilog/source/multiplier.v +37 -0
  56. da4ml/codegen/rtl/verilog/source/mux.v +58 -0
  57. da4ml/codegen/rtl/verilog/source/negative.v +31 -0
  58. da4ml/codegen/rtl/verilog/source/shift_adder.v +59 -0
  59. da4ml/codegen/rtl/vhdl/__init__.py +9 -0
  60. da4ml/codegen/rtl/vhdl/comb.py +206 -0
  61. da4ml/codegen/rtl/vhdl/io_wrapper.py +120 -0
  62. da4ml/codegen/rtl/vhdl/pipeline.py +71 -0
  63. da4ml/codegen/rtl/vhdl/source/lookup_table.vhd +52 -0
  64. da4ml/codegen/rtl/vhdl/source/multiplier.vhd +40 -0
  65. da4ml/codegen/rtl/vhdl/source/mux.vhd +102 -0
  66. da4ml/codegen/rtl/vhdl/source/negative.vhd +35 -0
  67. da4ml/codegen/rtl/vhdl/source/shift_adder.vhd +101 -0
  68. da4ml/converter/__init__.py +63 -0
  69. da4ml/converter/hgq2/__init__.py +3 -0
  70. da4ml/converter/hgq2/layers/__init__.py +11 -0
  71. da4ml/converter/hgq2/layers/_base.py +132 -0
  72. da4ml/converter/hgq2/layers/activation.py +81 -0
  73. da4ml/converter/hgq2/layers/attn.py +148 -0
  74. da4ml/converter/hgq2/layers/batchnorm.py +15 -0
  75. da4ml/converter/hgq2/layers/conv.py +149 -0
  76. da4ml/converter/hgq2/layers/dense.py +39 -0
  77. da4ml/converter/hgq2/layers/ops.py +246 -0
  78. da4ml/converter/hgq2/layers/pool.py +107 -0
  79. da4ml/converter/hgq2/layers/table.py +176 -0
  80. da4ml/converter/hgq2/parser.py +161 -0
  81. da4ml/trace/__init__.py +6 -0
  82. da4ml/trace/fixed_variable.py +965 -0
  83. da4ml/trace/fixed_variable_array.py +600 -0
  84. da4ml/trace/ops/__init__.py +13 -0
  85. da4ml/trace/ops/einsum_utils.py +305 -0
  86. da4ml/trace/ops/quantization.py +74 -0
  87. da4ml/trace/ops/reduce_utils.py +105 -0
  88. da4ml/trace/pipeline.py +181 -0
  89. da4ml/trace/tracer.py +186 -0
  90. da4ml/typing/__init__.py +3 -0
  91. da4ml-0.5.1.post1.dist-info/METADATA +85 -0
  92. da4ml-0.5.1.post1.dist-info/RECORD +96 -0
  93. da4ml-0.5.1.post1.dist-info/WHEEL +6 -0
  94. da4ml-0.5.1.post1.dist-info/entry_points.txt +3 -0
  95. da4ml-0.5.1.post1.dist-info/sboms/auditwheel.cdx.json +1 -0
  96. da4ml.libs/libgomp-e985bcbb.so.1.0.0 +0 -0
da4ml/trace/tracer.py ADDED
@@ -0,0 +1,186 @@
1
+ from collections.abc import Sequence
2
+ from decimal import Decimal
3
+ from itertools import chain
4
+ from math import log2
5
+ from uuid import UUID
6
+
7
+ import numpy as np
8
+
9
+ from ..cmvm.types import CombLogic, Op, QInterval
10
+ from .fixed_variable import FixedVariable, _const_f, table_context
11
+
12
+
13
+ def _recursive_gather(v: FixedVariable, gathered: dict[UUID, FixedVariable]):
14
+ if v.id in gathered:
15
+ return
16
+ assert v._from is not None
17
+ for _v in v._from:
18
+ _recursive_gather(_v, gathered)
19
+ gathered[v.id] = v
20
+
21
+
22
+ def gather_variables(inputs: Sequence[FixedVariable], outputs: Sequence[FixedVariable]):
23
+ gathered = {v.id: v for v in inputs}
24
+ for o in outputs:
25
+ _recursive_gather(o, gathered)
26
+ variables = list(gathered.values())
27
+
28
+ N = len(variables)
29
+ _index = sorted(list(range(N)), key=lambda i: variables[i].latency * N + i)
30
+ variables = [variables[i] for i in _index]
31
+
32
+ # Remove variables with 0 refcount
33
+ refcount = {v.id: 0 for v in variables}
34
+ for v in variables:
35
+ if v in inputs:
36
+ continue
37
+ for _v in v._from:
38
+ refcount[_v.id] += 1
39
+ for v in outputs:
40
+ refcount[v.id] += 1
41
+
42
+ variables = [v for v in variables if refcount[v.id] > 0]
43
+ index = {variables[i].id: i for i in range(len(variables))}
44
+
45
+ return variables, index
46
+
47
+
48
+ def _comb_trace(inputs: Sequence[FixedVariable], outputs: Sequence[FixedVariable]):
49
+ variables, index = gather_variables(inputs, outputs)
50
+ ops: list[Op] = []
51
+ inp_uuids = {v.id: i for i, v in enumerate(inputs)}
52
+ lookup_tables = []
53
+
54
+ table_map: dict[int, int] = {}
55
+ for v in variables:
56
+ if not v.opr == 'lookup':
57
+ continue
58
+ assert v._data is not None
59
+ idx = int(v._data)
60
+ if idx in table_map:
61
+ continue
62
+ table_map[idx] = len(lookup_tables)
63
+ lookup_tables.append(table_context.get_table_from_index(idx))
64
+
65
+ for i, v in enumerate(variables):
66
+ if v.id in inp_uuids and v.opr != 'const':
67
+ id0 = inp_uuids[v.id]
68
+ ops.append(Op(id0, -1, -1, 0, v.unscaled.qint, v.latency, 0.0))
69
+ continue
70
+ if v.opr == 'new':
71
+ raise NotImplementedError('Operation "new" is only expected in the input list')
72
+ match v.opr:
73
+ case 'vadd':
74
+ v0, v1 = v._from
75
+ f0, f1 = v0._factor, v1._factor
76
+ id0, id1 = index[v0.id], index[v1.id]
77
+ sub = int(f1 < 0)
78
+ data = int(log2(abs(f1 / f0)))
79
+ assert id0 < i and id1 < i, f'{id0} {id1} {i} {v.id}'
80
+ op = Op(id0, id1, sub, data, v.unscaled.qint, v.latency, v.cost)
81
+ case 'cadd':
82
+ v0 = v._from[0]
83
+ f0 = v0._factor
84
+ id0 = index[v0.id]
85
+ assert v._data is not None, 'cadd must have data'
86
+ qint = v.unscaled.qint
87
+ data = int(v._data / Decimal(qint.step))
88
+ assert id0 < i, f'{id0} {i} {v.id}'
89
+ op = Op(id0, -1, 4, data, qint, v.latency, v.cost)
90
+ case 'wrap':
91
+ v0 = v._from[0]
92
+ id0 = index[v0.id]
93
+ assert id0 < i, f'{id0} {i} {v.id}'
94
+ opcode = -3 if v._from[0]._factor < 0 else 3
95
+ op = Op(id0, -1, opcode, 0, v.unscaled.qint, v.latency, v.cost)
96
+ case 'relu':
97
+ v0 = v._from[0]
98
+ id0 = index[v0.id]
99
+ assert id0 < i, f'{id0} {i} {v.id}'
100
+ opcode = -2 if v._from[0]._factor < 0 else 2
101
+ op = Op(id0, -1, opcode, 0, v.unscaled.qint, v.latency, v.cost)
102
+ case 'const':
103
+ qint = v.unscaled.qint
104
+ assert qint.min == qint.max, f'const {v.id} {qint.min} {qint.max}'
105
+ f = _const_f(qint.min)
106
+ step = 2.0**-f
107
+ qint = QInterval(qint.min, qint.min, step)
108
+ data = qint.min / step
109
+ op = Op(-1, -1, 5, int(data), qint, v.latency, v.cost)
110
+ case 'msb_mux':
111
+ qint = v.unscaled.qint
112
+ key, in0, in1 = v._from
113
+ opcode = 6 if in1._factor > 0 else -6
114
+ idk, id0, id1 = index[key.id], index[in0.id], index[in1.id]
115
+ f0, f1 = in0._factor, in1._factor
116
+ shift = int(log2(abs(f1 / f0)))
117
+ data = idk + (shift << 32)
118
+ assert idk < i and id0 < i and id1 < i, f'{idk} {id0} {id1} {i} {v.id}'
119
+ assert key._factor > 0, f'Cannot mux on v{key.id} with negative factor {key._factor}'
120
+ op = Op(id0, id1, opcode, data, qint, v.latency, v.cost)
121
+ case 'vmul':
122
+ v0, v1 = v._from
123
+ opcode = 7
124
+ id0, id1 = index[v0.id], index[v1.id]
125
+ assert id0 < i and id1 < i, f'{id0} {id1} {i} {v.id}'
126
+ op = Op(id0, id1, opcode, 0, v.unscaled.qint, v.latency, v.cost)
127
+ case 'lookup':
128
+ opcode = 8
129
+ v0 = v._from[0]
130
+ id0 = index[v0.id]
131
+ data = v._data
132
+ assert data is not None, 'lookup must have data'
133
+ assert id0 < i, f'{id0} {i} {v.id}'
134
+ op = Op(id0, -1, opcode, table_map[int(data)], v.unscaled.qint, v.latency, v.cost)
135
+ case _:
136
+ raise NotImplementedError(f'Operation "{v.opr}" is not supported in tracing')
137
+
138
+ ops.append(op)
139
+ out_index = [index[v.id] for v in outputs]
140
+ lookup_tables = None if not lookup_tables else tuple(lookup_tables)
141
+ return ops, out_index, lookup_tables
142
+
143
+
144
+ def comb_trace(inputs, outputs):
145
+ if isinstance(inputs, FixedVariable):
146
+ inputs = [inputs]
147
+ if isinstance(outputs, FixedVariable):
148
+ outputs = [outputs]
149
+
150
+ inputs, outputs = list(np.ravel(inputs)), list(np.ravel(outputs)) # type: ignore
151
+
152
+ if any(not isinstance(v, FixedVariable) for v in outputs):
153
+ hwconf = inputs[0].hwconf
154
+ latency = max(v.latency for v in chain(inputs, outputs) if isinstance(v, FixedVariable))
155
+ outputs = list(outputs)
156
+ for i, v in enumerate(outputs):
157
+ if not isinstance(v, FixedVariable):
158
+ outputs[i] = FixedVariable.from_const(v, hwconf, latency, 1)
159
+
160
+ ops, out_index, lookup_tables = _comb_trace(inputs, outputs)
161
+ shape = len(inputs), len(outputs)
162
+ inp_shifts = [0] * shape[0]
163
+ out_sf = [v._factor for v in outputs]
164
+ out_shift = [int(log2(abs(sf))) for sf in out_sf]
165
+ out_neg = [sf < 0 for sf in out_sf]
166
+
167
+ sol = CombLogic(
168
+ shape,
169
+ inp_shifts,
170
+ out_index,
171
+ out_shift,
172
+ out_neg,
173
+ ops,
174
+ outputs[0].hwconf.carry_size,
175
+ outputs[0].hwconf.adder_size,
176
+ lookup_tables,
177
+ )
178
+
179
+ ref_count = sol.ref_count
180
+
181
+ for i in range(len(ops)):
182
+ if ref_count[i] == 0:
183
+ op = ops[i]
184
+ sol.ops[i] = Op(-1, -1, 5, 0, QInterval(0, 0, 1), op[5], 0.0)
185
+
186
+ return sol
@@ -0,0 +1,3 @@
1
+ from ..cmvm.api import solver_options_t
2
+
3
+ __all__ = ['solver_options_t']
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.1
2
+ Name: da4ml
3
+ Version: 0.5.1.post1
4
+ Summary: Distributed Arithmetic for Machine Learning
5
+ Keywords: CMVM,distributed arithmetic,high-level synthesis,machine learning,RTL/HLS compilation
6
+ Author-Email: Chang Sun <chsun@cern.ch>
7
+ License: GNU Lesser General Public License v3 (LGPLv3)
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python :: 3 :: Only
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Project-URL: repository, https://github.com/calad0i/da4ml
18
+ Requires-Python: >=3.10
19
+ Requires-Dist: llvmlite>=0.44
20
+ Requires-Dist: numba>=0.61
21
+ Requires-Dist: quantizers<2,>=1
22
+ Provides-Extra: docs
23
+ Requires-Dist: hgq2; extra == "docs"
24
+ Requires-Dist: myst-parser; extra == "docs"
25
+ Requires-Dist: pyparsing; extra == "docs"
26
+ Requires-Dist: sphinx; extra == "docs"
27
+ Requires-Dist: sphinx-rtd-theme; extra == "docs"
28
+ Description-Content-Type: text/markdown
29
+
30
+ # da4ml: Distributed Arithmetic for Machine Learning
31
+
32
+ [![LGPLv3](https://img.shields.io/badge/License-LGPLv3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)
33
+ [![Documentation](https://github.com/calad0i/da4ml/actions/workflows/sphinx-build.yml/badge.svg)](https://calad0i.github.io/da4ml/)
34
+ [![PyPI version](https://badge.fury.io/py/da4ml.svg)](https://badge.fury.io/py/da4ml)
35
+ [![ArXiv](https://img.shields.io/badge/arXiv-2507.04535-b31b1b.svg)](https://arxiv.org/abs/2507.04535)
36
+
37
+ da4ml is a static computation graph to RTL/HLS design compiler targeting ultra-low latency applications on FPGAs. It as two major components:
38
+ - A fast and performant constant-matrix-vector multiplications (CMVM) optimizer to implement them as
39
+ efficient adder trees. Common sub-expressions elimination (CSE) with graph-based pre-optimization are
40
+ performed to reduce the firmware footprint and improve the performance.
41
+ - Low-level symbolic tracing frameworks for generating combinational/fully pipelined logics in HDL or HLS
42
+ code. da4ml can generate the firmware for almost all fully pipelined networks standalone.
43
+ Alternatively, da4ml also be used as a plugin in hls4ml to optimize the CMVM operations in the network.
44
+
45
+ Key Features
46
+ ------------
47
+
48
+ - **Optimized Algorithms**: Comparing to hls4ml's latency strategy, da4ml's CMVM implementation uses no DSO and consumes up to 50% less LUT usage.
49
+ - **Fast code generation**: da4ml can generate HDL for a fully pipelined network in seconds. For the same models, high-level synthesis tools like Vivado/Vitis HLS can take up to days to generate the HDL code.
50
+ - **Low-level symbolic tracing**: As long as the operation can be expressed by a combination of the low-level operations supported, adding new operations is straightforward by "replaying" the operation on the symbolic tensor provided. In most cases, adding support for a new operation/layer takes just a few lines of code in numpy flavor.
51
+ - **Automatic model conversion**: da4ml can automatically convert models trained in `HGQ2 <https://github.com/calad0i/hgq2>`_.
52
+ - **Bit-accurate Emulation**: All operation in da4ml is bit-accurate, meaning the generated HDL code will produce the same output as the original model. da4ml's computation is converted to a RISC-like, instruction set level intermediate representation, distributed arithmetic instruction set (DAIS), which can be easily simulated in multiple ways. da4ml also provides a fast C++ based DAIS interpreter to run bit-exact inference on the traced models for verification and benchmarking.
53
+ - **hls4ml integration**: da4ml can be used as a plugin in hls4ml to optimize the CMVM operations in the network by setting `strategy='distributed_arithmetic'` for the strategy of the Dense, EinsumDense, or Conv1/2D layers.
54
+
55
+ Installation
56
+ ------------
57
+
58
+ ```bash
59
+ pip install da4ml
60
+ ```
61
+
62
+ Getting Started
63
+ ---------------
64
+
65
+ - See the [Getting Started](https://calad0i.github.io/da4ml/getting_started.html) guide for a quick introduction to using da4ml.
66
+ - See [JEDI-linear](https://github.com/calad0i/JEDI-linear) project which is based on da4ml
67
+
68
+ # Citation
69
+
70
+ If you use da4ml in a publication, please cite our [TRETS'25 paper](https://doi.org/10.1145/3777387) with the following bibtex entry:
71
+
72
+ ```bibtex
73
+ @article{sun2025da4ml,
74
+ author = {Sun, Chang and Que, Zhiqiang and Loncar, Vladimir and Luk, Wayne and Spiropulu, Maria},
75
+ title = {da4ml: Distributed Arithmetic for Real-time Neural Networks on FPGAs},
76
+ year = {2025},
77
+ publisher = {Association for Computing Machinery},
78
+ address = {New York, NY, USA},
79
+ issn = {1936-7406},
80
+ url = {https://doi.org/10.1145/3777387},
81
+ doi = {10.1145/3777387},
82
+ journal = {ACM Trans. Reconfigurable Technol. Syst.},
83
+ month = nov,
84
+ }
85
+ ```
@@ -0,0 +1,96 @@
1
+ da4ml/__init__.py,sha256=CdDGcEvJYOglY41iYFP3yjfNYZ5s5BPF0fiv8J5aYBY,141
2
+ da4ml/_version.py,sha256=Mio7ZZNL-qwwu2-i_L3fL10ESyrOcyOPRs-XhjXymew,745
3
+ da4ml/_binary/__init__.py,sha256=01vyWJ5iIjBAsCfEpMb61BT6bNb2uAtPRDLGt5XwmIc,499
4
+ da4ml/_binary/dais_bin.cpython-311-x86_64-linux-gnu.so,sha256=qUP7-iBOhn-LILGiQdSD7ZXh02UKi8ifg-ZbXj9zL7o,144473
5
+ da4ml/_binary/dais_bin.pyi,sha256=DiVt0BnA90meikvsvEy3y-O2bilPQv21ajS3UBiJJoQ,177
6
+ da4ml/_cli/__init__.py,sha256=5pkRjJ9ccsZNYwXXnOba2NByn6AHSj7b8SB5QDaOKPE,966
7
+ da4ml/_cli/convert.py,sha256=tW-9TTkZZrAlFU5whfVD45ToShZteCP-keeuD3XtfYI,7518
8
+ da4ml/_cli/report.py,sha256=2QQlqex1MLhip2TTl1K_12RO4kCbrdQMlyVdE3KqP6E,9400
9
+ da4ml/cmvm/__init__.py,sha256=zGEQmYlZjWJdY1IhMtIYydWLDLoAogFprEefAZZP0bo,156
10
+ da4ml/cmvm/api.py,sha256=fRMUgY4XjwFfvkIrWrfUXHdPjg720vlNK2sqcynvwOE,9820
11
+ da4ml/cmvm/types.py,sha256=V2G_aNdyvSQqt5mq6HZ7Vb3zGbrba-JN3ejjBuf9pRE,24742
12
+ da4ml/cmvm/core/__init__.py,sha256=Kfym-vo6xh1eoUJh2nzcCkAxwEcEl-aXr-zrUw3tr2g,7706
13
+ da4ml/cmvm/core/indexers.py,sha256=QjXgvExS-B2abHTJPDG4NufMdMEflo1i6cUhFOgJpH4,2945
14
+ da4ml/cmvm/core/state_opr.py,sha256=wLqO8qVuM2-qCE5LDeYJDNkUruIPHy63obsv4-x-aR8,8661
15
+ da4ml/cmvm/util/__init__.py,sha256=DkBlUEKA_Gu7n576ja_xZlAQfToWmNL9VXU-jmj6a-g,145
16
+ da4ml/cmvm/util/bit_decompose.py,sha256=g4dsvyPl6FENTUUK7gv_IgTIFNPg_TJa0MszCDOqdXc,2276
17
+ da4ml/cmvm/util/mat_decompose.py,sha256=Ktdwrea6VfGqW2wqd7-p5DyYWmMdV0S3v5MyzTJgX4g,4106
18
+ da4ml/codegen/__init__.py,sha256=ldMaaixWMxEpLS6skyAgpGCcIMVHdeRCNy57-JxGn3Y,161
19
+ da4ml/codegen/hls/__init__.py,sha256=LkTtnKTGKX39-wpf7jb10BZ15-dpw4pIlQoATYfVOec,134
20
+ da4ml/codegen/hls/hls_codegen.py,sha256=brCKwhvNz2QYn9eXN-bq8TYx_u_u5eck_AN8cx6ML_8,6769
21
+ da4ml/codegen/hls/hls_model.py,sha256=vBik4t6Vo4Swm3eH5pt3eNkGejNACs4bbZ32bxWS0Qg,9223
22
+ da4ml/codegen/hls/source/binder_util.hh,sha256=aSsFaaKdlDPpILWVGJ6zDM6UsNYZXgcOAcaLPHudHNU,2395
23
+ da4ml/codegen/hls/source/build_binder.mk,sha256=9Uz-5BJKWo2utkS4o7DpYny5spIcJJgWBMw5Nd4qFZc,565
24
+ da4ml/codegen/hls/source/vitis_bitshift.hh,sha256=u8wjT_cRn7bXcbC5pH3-rS76ekRbwv-VWAAdaP52-dw,765
25
+ da4ml/codegen/hls/source/ap_types/ap_binary.h,sha256=yOcafu2IofstDqxn0wDq8vY3JIwZQ9H5z6IY1dEqMr0,2764
26
+ da4ml/codegen/hls/source/ap_types/ap_common.h,sha256=1hJY9uvKOdwRSSll5uehUISZR4tsSsQ1z4PNRUc44KU,10180
27
+ da4ml/codegen/hls/source/ap_types/ap_decl.h,sha256=z1HsH-2RSvSoofTZR7RHeqIfAnEYVuHcIu_ute9gjEg,6473
28
+ da4ml/codegen/hls/source/ap_types/ap_fixed.h,sha256=3ld4qyF475nDto57AHcsLd-PfoJ7dlplDoZPLXIo6d4,12185
29
+ da4ml/codegen/hls/source/ap_types/ap_fixed_base.h,sha256=Cd1AJQZjHxVKbvo4w9a9ylkEyNjdXHR7VF9iUoGTb0o,85182
30
+ da4ml/codegen/hls/source/ap_types/ap_fixed_ref.h,sha256=TO9yZqdWf0VksXmG4SN9_n_CDYQVWU4yuja0YfkrQCw,27302
31
+ da4ml/codegen/hls/source/ap_types/ap_fixed_special.h,sha256=yXfQnjAc8vJv5T6R9a4L_eA0U_a0ypzK_RSn8yqzt_s,6985
32
+ da4ml/codegen/hls/source/ap_types/ap_int.h,sha256=nTiyrFN8IPCGRs5RYpCkLT9y4IxaqoRUHtIbpUiOLNA,10012
33
+ da4ml/codegen/hls/source/ap_types/ap_int_base.h,sha256=Kt4QjfUW85r8lxjY4ESqelR_CnpM0ubb4K5d2G03GMQ,71735
34
+ da4ml/codegen/hls/source/ap_types/ap_int_ref.h,sha256=5rsOdablweC9hKGtQ8Kktr077sEQ91gzSH5G5hM7m5Y,55218
35
+ da4ml/codegen/hls/source/ap_types/ap_int_special.h,sha256=HIvRRuiKGpAnCpigURX0cOQUX88dbp3lGkUWpbglMCI,6301
36
+ da4ml/codegen/hls/source/ap_types/ap_shift_reg.h,sha256=wqe8j3ikbdZiXwYsYlAsFbOFeQLhYXIbKoRC6fJGeuc,4894
37
+ da4ml/codegen/hls/source/ap_types/hls_math.h,sha256=abFBoZzYjm_pfC2wkuclVh1HuvYJ_YobnN-1Q99GRic,674
38
+ da4ml/codegen/hls/source/ap_types/hls_stream.h,sha256=NTkVfbE48c6XnMIfR9WzJbDwUnfe6y19xJXxBS3G--I,7480
39
+ da4ml/codegen/hls/source/ap_types/etc/ap_private.h,sha256=TDdxGIX0r3D6Ql8KeXoceRmHhdlwFA3Akr3-vvMVAtk,261465
40
+ da4ml/codegen/hls/source/ap_types/utils/x_hls_utils.h,sha256=x24cf1HyZKv0J8YQIoUvYE3uw6SNL7vWetRGIiFm2Jw,2227
41
+ da4ml/codegen/rtl/__init__.py,sha256=51VNqMc0JygphulBB4jjqeL9Sd18IUjGhkp2oyUDdnA,505
42
+ da4ml/codegen/rtl/rtl_model.py,sha256=tbktwqABQEKv4YOcZduNoYURhdT99X-3USik60BJwgE,18560
43
+ da4ml/codegen/rtl/common_source/binder_util.hh,sha256=0OvKZlFmwB7_WNFdZDu9NuvRU3tVha78uvwwlaDkGvo,3242
44
+ da4ml/codegen/rtl/common_source/build_binder.mk,sha256=_hjzwQgDBgrEvrYKxvjNvh4LKCoWlVg2MRNcAduSZyE,1678
45
+ da4ml/codegen/rtl/common_source/build_quartus_prj.tcl,sha256=nnMFMu_iN_O5dJyqlzz1q9qi0QjIOKtl_lR4ZHqFLHg,3155
46
+ da4ml/codegen/rtl/common_source/build_vivado_prj.tcl,sha256=C1zJODOmnnsHfwd2ssqCn2W6b2asXFjTfkligf-OyL0,4205
47
+ da4ml/codegen/rtl/common_source/ioutil.hh,sha256=A_ecPyipSulIYkvqSswpKDExSADCc79nvBUkg5xoKWw,3967
48
+ da4ml/codegen/rtl/common_source/template.sdc,sha256=_hb-fwZopC84_I2qkhxPOw6mvc5vC7jat4tGUtg6u4w,1148
49
+ da4ml/codegen/rtl/common_source/template.xdc,sha256=0wVPQ37qQduDbcwb3MoWdlrJ1Cg7Or4JDzl8C3BVNGM,1281
50
+ da4ml/codegen/rtl/verilog/__init__.py,sha256=y29vu0R8lfidhQP3hPwg5nFbE6SmTx856vUcnMMHcD0,244
51
+ da4ml/codegen/rtl/verilog/comb.py,sha256=6ORcnYzWSGYzuv1eEhYUQeuwT4aPSFv_ja8lTVUBGGY,8889
52
+ da4ml/codegen/rtl/verilog/io_wrapper.py,sha256=nPyfq2167_oGWLe6DRsFDQlRS4kDxuq0fNhfPBoSygM,3896
53
+ da4ml/codegen/rtl/verilog/pipeline.py,sha256=8Vj0o3ujI-VxCJC3VPXkkB3_fkQkf_A4fiiWG1gVgzs,2424
54
+ da4ml/codegen/rtl/verilog/source/lookup_table.v,sha256=7FhPgjtXwafz5aN-xTmbe4LZqmPPRsfJ5IKUPWNNKgM,504
55
+ da4ml/codegen/rtl/verilog/source/multiplier.v,sha256=MfgRYi7jYPp4W94KLKWpc2MPu2Dg9CDiQ3lJizSIlIQ,1122
56
+ da4ml/codegen/rtl/verilog/source/mux.v,sha256=1PMSQKGR_Cku1EQnePBVCuX6we_dqYBXW54WBEURvs0,1928
57
+ da4ml/codegen/rtl/verilog/source/negative.v,sha256=Oipme2hmMnwtRBQp5wuFN0RpimjHBZayg909vMh7RTk,826
58
+ da4ml/codegen/rtl/verilog/source/shift_adder.v,sha256=qrpXBX9bhHI-o75v5zshOfq0giEATvbeGgTir20_S3Q,1915
59
+ da4ml/codegen/rtl/vhdl/__init__.py,sha256=Jlyaj_Hj3-e4rE1d8XWHwTsKUWsqMY6mdvjrnNNDxX4,208
60
+ da4ml/codegen/rtl/vhdl/comb.py,sha256=lwbgWJBqxz2QUF1SNZa_ifadW9UeEzxkLYPq0FnZH6o,8412
61
+ da4ml/codegen/rtl/vhdl/io_wrapper.py,sha256=hG6CHSpww0e7DZWUhP5PJzhjW6QQduBLFzx_xHLnx9U,4186
62
+ da4ml/codegen/rtl/vhdl/pipeline.py,sha256=q-7MOYczLYAK-MDg4XhmBGQlffIpnXKtIWGFOz-4uOw,2645
63
+ da4ml/codegen/rtl/vhdl/source/lookup_table.vhd,sha256=lcZzyMZOOpn0vrX4qt-ZqHgT4FfmnFlS0s-jI1dBqCE,1518
64
+ da4ml/codegen/rtl/vhdl/source/multiplier.vhd,sha256=Hx63VZy_nVrv7qokwz50fTQVB7LbSBpfRKXhv4lXRAQ,1323
65
+ da4ml/codegen/rtl/vhdl/source/mux.vhd,sha256=tN8XbK0kD71arjEU--tidtWFpmdyxT37E7HLRC0zMYw,3442
66
+ da4ml/codegen/rtl/vhdl/source/negative.vhd,sha256=rTOGEdbONDcpWmOw_g3BTr3f5rZEFIhoG_0X0c_Q2NQ,1019
67
+ da4ml/codegen/rtl/vhdl/source/shift_adder.vhd,sha256=pIBchIa0zXmRcqwGF308_TEzh6aWOTboTEir6lMiSrE,3455
68
+ da4ml/converter/__init__.py,sha256=pU76xGf9XmEICQGe5STvh9m4ICqI-OzByBVNOxI7UmE,1978
69
+ da4ml/converter/hgq2/__init__.py,sha256=-gnT_7zXY-KQtPLxsqngwDKZ2TUIynn996pUjjB03B8,59
70
+ da4ml/converter/hgq2/parser.py,sha256=_Owr6V0S3Rn44b_3GxNtZXQQSvmLoXGNOUIX7uAl0VA,5785
71
+ da4ml/converter/hgq2/layers/__init__.py,sha256=lj8Vb2Byg9RpQq-fCvq-86ESJLCohk88qAmP_iOIuUI,226
72
+ da4ml/converter/hgq2/layers/_base.py,sha256=Xte8_wAe0TAZfV1CRsc3P1TQT1oxF4WAy1IvX2wcCZ8,5102
73
+ da4ml/converter/hgq2/layers/activation.py,sha256=59Tv-hJuTd-a20DT2krS2kha2-pZC_bve1wSQD-rLKc,2657
74
+ da4ml/converter/hgq2/layers/attn.py,sha256=9t8vdmB3hhDWYZ2gkH1l529OJOL4airHekYfHPnFUis,4748
75
+ da4ml/converter/hgq2/layers/batchnorm.py,sha256=wIdolCBkwHqk_AfTzOcZ-rcdzsMjSaOfwRggad93VFM,515
76
+ da4ml/converter/hgq2/layers/conv.py,sha256=OZ9giI6eClGByNE-XaqNCn1YtgwainDd_6HDeMVINds,4695
77
+ da4ml/converter/hgq2/layers/dense.py,sha256=WPMKlj8crzSgLxHcpkcDx23mI7YoaT-d-qYjij-KseE,1207
78
+ da4ml/converter/hgq2/layers/ops.py,sha256=hXvenK-XZSiiZsL5BjcCnJ13D9pJRmZmoYKc-qOd1Vk,8301
79
+ da4ml/converter/hgq2/layers/pool.py,sha256=wFaMo4f-2tU3CM_Bb0kkPvlyPZRPwEtlN6Uf2lPQpFQ,3917
80
+ da4ml/converter/hgq2/layers/table.py,sha256=RbGSTAAYdpPDLiWIxWu-2SdwZO38BulH5jkF9xkfmIM,6489
81
+ da4ml/trace/__init__.py,sha256=bLBbTDRHaObS_hY5w6_s266_KflVisM-WaVNTPl-dZw,314
82
+ da4ml/trace/fixed_variable.py,sha256=THZa0mMZ0yWT_Mv8pMpgxugtJpGr1pH9Hd49BAlu6qg,32600
83
+ da4ml/trace/fixed_variable_array.py,sha256=NAbhmHyHxAzB-gMrbtSa5b30hYLhIeAvHq36ZP6gf6E,22495
84
+ da4ml/trace/pipeline.py,sha256=pjJ5sRTYuHxdbsZgr8o6x4R-8xjGHM3IL7iWs94Y0AM,6189
85
+ da4ml/trace/tracer.py,sha256=UC1nqOPw-5SKQoYrbh10Fkii3TKGvvbDaV9dG1KAoRk,6974
86
+ da4ml/trace/ops/__init__.py,sha256=BOxoBfEuJaIhPHmlkZvXhyM5avKBAh5k5r9Qf3djOYw,238
87
+ da4ml/trace/ops/einsum_utils.py,sha256=ODofbvR98FwKBTDZsJ0ObbMjU9_GjPu5AbGuWX6sdCY,11453
88
+ da4ml/trace/ops/quantization.py,sha256=zhNU-qQwkQ_uX0EsnvIOQvOZmB-yXOiUnVi6NugBY2E,2655
89
+ da4ml/trace/ops/reduce_utils.py,sha256=FE0S6nrZYqww4LxspU-jXfBaNFN614NpZ-98UVnVfdg,3480
90
+ da4ml/typing/__init__.py,sha256=9w6s4LZi7wGIqaRs3rLioPXsf6lErYdo1_rHTqGqb2Q,72
91
+ da4ml.libs/libgomp-e985bcbb.so.1.0.0,sha256=pDkE5PopcwHUZA3BuzyKNIC0BvmeSY66mxkUtoqrYEo,253289
92
+ da4ml-0.5.1.post1.dist-info/METADATA,sha256=Ui_K3vNZorfMvdwFTcoumjFUb-vHUdijbjv0BAZa9kg,4968
93
+ da4ml-0.5.1.post1.dist-info/WHEEL,sha256=-PRFuKV2Mmc9_5cjuD-UNN7YLg4OyntAAjaeo6DTU3w,138
94
+ da4ml-0.5.1.post1.dist-info/entry_points.txt,sha256=aUREcooadLOLJJPJtztEXvMGPb695OsnkmebhzRNx4M,43
95
+ da4ml-0.5.1.post1.dist-info/RECORD,,
96
+ da4ml-0.5.1.post1.dist-info/sboms/auditwheel.cdx.json,sha256=sat4DWSTg9avgCAVPAQFnRMfXQrH4Xfau__1jzJhC_c,1466
@@ -0,0 +1,6 @@
1
+ Wheel-Version: 1.0
2
+ Generator: meson
3
+ Root-Is-Purelib: false
4
+ Tag: cp311-cp311-manylinux_2_24_x86_64
5
+ Tag: cp311-cp311-manylinux_2_28_x86_64
6
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ da4ml = da4ml._cli:main
3
+
@@ -0,0 +1 @@
1
+ {"bomFormat": "CycloneDX", "specVersion": "1.4", "version": 1, "metadata": {"component": {"type": "library", "bom-ref": "pkg:pypi/da4ml@0.5.1.post1?file_name=da4ml-0.5.1.post1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", "name": "da4ml", "version": "0.5.1.post1", "purl": "pkg:pypi/da4ml@0.5.1.post1?file_name=da4ml-0.5.1.post1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl"}, "tools": [{"name": "auditwheel", "version": "6.5.0"}]}, "components": [{"type": "library", "bom-ref": "pkg:pypi/da4ml@0.5.1.post1?file_name=da4ml-0.5.1.post1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", "name": "da4ml", "version": "0.5.1.post1", "purl": "pkg:pypi/da4ml@0.5.1.post1?file_name=da4ml-0.5.1.post1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl"}, {"type": "library", "bom-ref": "pkg:rpm/almalinux/libgomp@8.5.0-28.el8_10.alma.1#c61017c9a24eb6e1e1a3cdc9becd004a6419cbda3d54b4848b98f240a4829571", "name": "libgomp", "version": "8.5.0-28.el8_10.alma.1", "purl": "pkg:rpm/almalinux/libgomp@8.5.0-28.el8_10.alma.1"}], "dependencies": [{"ref": "pkg:pypi/da4ml@0.5.1.post1?file_name=da4ml-0.5.1.post1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", "dependsOn": ["pkg:rpm/almalinux/libgomp@8.5.0-28.el8_10.alma.1#c61017c9a24eb6e1e1a3cdc9becd004a6419cbda3d54b4848b98f240a4829571"]}, {"ref": "pkg:rpm/almalinux/libgomp@8.5.0-28.el8_10.alma.1#c61017c9a24eb6e1e1a3cdc9becd004a6419cbda3d54b4848b98f240a4829571"}]}
Binary file