da4ml 0.5.0__cp312-cp312-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.
- da4ml/__init__.py +4 -0
- da4ml/_binary/__init__.py +15 -0
- da4ml/_binary/dais_bin.cpython-312-x86_64-linux-gnu.so +0 -0
- da4ml/_binary/dais_bin.pyi +5 -0
- da4ml/_cli/__init__.py +30 -0
- da4ml/_cli/convert.py +194 -0
- da4ml/_cli/report.py +295 -0
- da4ml/_version.py +32 -0
- da4ml/cmvm/__init__.py +4 -0
- da4ml/cmvm/api.py +264 -0
- da4ml/cmvm/core/__init__.py +221 -0
- da4ml/cmvm/core/indexers.py +83 -0
- da4ml/cmvm/core/state_opr.py +284 -0
- da4ml/cmvm/types.py +739 -0
- da4ml/cmvm/util/__init__.py +7 -0
- da4ml/cmvm/util/bit_decompose.py +86 -0
- da4ml/cmvm/util/mat_decompose.py +121 -0
- da4ml/codegen/__init__.py +9 -0
- da4ml/codegen/hls/__init__.py +4 -0
- da4ml/codegen/hls/hls_codegen.py +196 -0
- da4ml/codegen/hls/hls_model.py +255 -0
- da4ml/codegen/hls/source/ap_types/ap_binary.h +78 -0
- da4ml/codegen/hls/source/ap_types/ap_common.h +376 -0
- da4ml/codegen/hls/source/ap_types/ap_decl.h +212 -0
- da4ml/codegen/hls/source/ap_types/ap_fixed.h +360 -0
- da4ml/codegen/hls/source/ap_types/ap_fixed_base.h +2354 -0
- da4ml/codegen/hls/source/ap_types/ap_fixed_ref.h +718 -0
- da4ml/codegen/hls/source/ap_types/ap_fixed_special.h +230 -0
- da4ml/codegen/hls/source/ap_types/ap_int.h +330 -0
- da4ml/codegen/hls/source/ap_types/ap_int_base.h +1885 -0
- da4ml/codegen/hls/source/ap_types/ap_int_ref.h +1346 -0
- da4ml/codegen/hls/source/ap_types/ap_int_special.h +223 -0
- da4ml/codegen/hls/source/ap_types/ap_shift_reg.h +138 -0
- da4ml/codegen/hls/source/ap_types/etc/ap_private.h +7199 -0
- da4ml/codegen/hls/source/ap_types/hls_math.h +27 -0
- da4ml/codegen/hls/source/ap_types/hls_stream.h +263 -0
- da4ml/codegen/hls/source/ap_types/utils/x_hls_utils.h +80 -0
- da4ml/codegen/hls/source/binder_util.hh +71 -0
- da4ml/codegen/hls/source/build_binder.mk +22 -0
- da4ml/codegen/hls/source/vitis_bitshift.hh +32 -0
- da4ml/codegen/rtl/__init__.py +15 -0
- da4ml/codegen/rtl/common_source/binder_util.hh +99 -0
- da4ml/codegen/rtl/common_source/build_binder.mk +34 -0
- da4ml/codegen/rtl/common_source/build_quartus_prj.tcl +104 -0
- da4ml/codegen/rtl/common_source/build_vivado_prj.tcl +111 -0
- da4ml/codegen/rtl/common_source/ioutil.hh +124 -0
- da4ml/codegen/rtl/common_source/template.sdc +27 -0
- da4ml/codegen/rtl/common_source/template.xdc +30 -0
- da4ml/codegen/rtl/rtl_model.py +486 -0
- da4ml/codegen/rtl/verilog/__init__.py +10 -0
- da4ml/codegen/rtl/verilog/comb.py +239 -0
- da4ml/codegen/rtl/verilog/io_wrapper.py +113 -0
- da4ml/codegen/rtl/verilog/pipeline.py +67 -0
- da4ml/codegen/rtl/verilog/source/lookup_table.v +27 -0
- da4ml/codegen/rtl/verilog/source/multiplier.v +37 -0
- da4ml/codegen/rtl/verilog/source/mux.v +58 -0
- da4ml/codegen/rtl/verilog/source/negative.v +31 -0
- da4ml/codegen/rtl/verilog/source/shift_adder.v +59 -0
- da4ml/codegen/rtl/vhdl/__init__.py +9 -0
- da4ml/codegen/rtl/vhdl/comb.py +206 -0
- da4ml/codegen/rtl/vhdl/io_wrapper.py +120 -0
- da4ml/codegen/rtl/vhdl/pipeline.py +71 -0
- da4ml/codegen/rtl/vhdl/source/lookup_table.vhd +52 -0
- da4ml/codegen/rtl/vhdl/source/multiplier.vhd +40 -0
- da4ml/codegen/rtl/vhdl/source/mux.vhd +102 -0
- da4ml/codegen/rtl/vhdl/source/negative.vhd +35 -0
- da4ml/codegen/rtl/vhdl/source/shift_adder.vhd +101 -0
- da4ml/converter/__init__.py +63 -0
- da4ml/converter/hgq2/__init__.py +3 -0
- da4ml/converter/hgq2/layers/__init__.py +11 -0
- da4ml/converter/hgq2/layers/_base.py +132 -0
- da4ml/converter/hgq2/layers/activation.py +81 -0
- da4ml/converter/hgq2/layers/attn.py +148 -0
- da4ml/converter/hgq2/layers/batchnorm.py +15 -0
- da4ml/converter/hgq2/layers/conv.py +149 -0
- da4ml/converter/hgq2/layers/dense.py +39 -0
- da4ml/converter/hgq2/layers/ops.py +240 -0
- da4ml/converter/hgq2/layers/pool.py +107 -0
- da4ml/converter/hgq2/layers/table.py +176 -0
- da4ml/converter/hgq2/parser.py +161 -0
- da4ml/trace/__init__.py +6 -0
- da4ml/trace/fixed_variable.py +965 -0
- da4ml/trace/fixed_variable_array.py +600 -0
- da4ml/trace/ops/__init__.py +13 -0
- da4ml/trace/ops/einsum_utils.py +305 -0
- da4ml/trace/ops/quantization.py +74 -0
- da4ml/trace/ops/reduce_utils.py +105 -0
- da4ml/trace/pipeline.py +181 -0
- da4ml/trace/tracer.py +186 -0
- da4ml/typing/__init__.py +3 -0
- da4ml-0.5.0.dist-info/METADATA +85 -0
- da4ml-0.5.0.dist-info/RECORD +96 -0
- da4ml-0.5.0.dist-info/WHEEL +6 -0
- da4ml-0.5.0.dist-info/entry_points.txt +3 -0
- da4ml-0.5.0.dist-info/sboms/auditwheel.cdx.json +1 -0
- 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
|
da4ml/typing/__init__.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: da4ml
|
|
3
|
+
Version: 0.5.0
|
|
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
|
+
[](https://www.gnu.org/licenses/lgpl-3.0)
|
|
33
|
+
[](https://calad0i.github.io/da4ml/)
|
|
34
|
+
[](https://badge.fury.io/py/da4ml)
|
|
35
|
+
[](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=gPUhPWC4o5xE5q4UDniQNu_Oqot8qdOn9wYKW-ABBUo,740
|
|
3
|
+
da4ml/_binary/__init__.py,sha256=01vyWJ5iIjBAsCfEpMb61BT6bNb2uAtPRDLGt5XwmIc,499
|
|
4
|
+
da4ml/_binary/dais_bin.cpython-312-x86_64-linux-gnu.so,sha256=l_DkwHC4L5n139891WgNRjZezM-6DhuxcGsFxhHtTuk,144417
|
|
5
|
+
da4ml/_binary/dais_bin.pyi,sha256=DiVt0BnA90meikvsvEy3y-O2bilPQv21ajS3UBiJJoQ,177
|
|
6
|
+
da4ml/_cli/__init__.py,sha256=5pkRjJ9ccsZNYwXXnOba2NByn6AHSj7b8SB5QDaOKPE,966
|
|
7
|
+
da4ml/_cli/convert.py,sha256=8615fcb0BFqlBaNGr8W-KzMYPRfWER4hRrcTl-4fX6c,7189
|
|
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=0BPFFIwu3arog9NAvjWNURFAyHOstIWhq1dznhL4BkE,2264
|
|
17
|
+
da4ml/cmvm/util/mat_decompose.py,sha256=eSJNlXwx_jxgqt5vLJrSLQaeq2ZXu8j9mC4d-eq883M,4094
|
|
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=9Va5FBQfe3V6HGlz1vUL1ZPUhzhnkvOfMLmnr5kyx7M,476
|
|
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=WKWzmYINjSc_zWaroPoFK6nlAzZv4wJY6qShYZWyQlM,7992
|
|
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.0.dist-info/METADATA,sha256=BzoUntmdr0jj5_AFs689vw0cFmjyhyclvlLdXu9ZSZk,4962
|
|
93
|
+
da4ml-0.5.0.dist-info/WHEEL,sha256=5CT1xAVtUA3SK4LW_XdoM9Kto3PJPVP1rBIfK8BYqcM,138
|
|
94
|
+
da4ml-0.5.0.dist-info/entry_points.txt,sha256=aUREcooadLOLJJPJtztEXvMGPb695OsnkmebhzRNx4M,43
|
|
95
|
+
da4ml-0.5.0.dist-info/RECORD,,
|
|
96
|
+
da4ml-0.5.0.dist-info/sboms/auditwheel.cdx.json,sha256=ZOIrk7r9s3ZHhFMTlbo9T3gYvRYkmLh2mVfEPCZtsDk,1394
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"bomFormat": "CycloneDX", "specVersion": "1.4", "version": 1, "metadata": {"component": {"type": "library", "bom-ref": "pkg:pypi/da4ml@0.5.0?file_name=da4ml-0.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", "name": "da4ml", "version": "0.5.0", "purl": "pkg:pypi/da4ml@0.5.0?file_name=da4ml-0.5.0-cp312-cp312-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.0?file_name=da4ml-0.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", "name": "da4ml", "version": "0.5.0", "purl": "pkg:pypi/da4ml@0.5.0?file_name=da4ml-0.5.0-cp312-cp312-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.0?file_name=da4ml-0.5.0-cp312-cp312-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
|