oasm.dev 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oasm_dev-0.1.0/PKG-INFO +14 -0
- oasm_dev-0.1.0/README.md +1 -0
- oasm_dev-0.1.0/pyproject.toml +18 -0
- oasm_dev-0.1.0/setup.cfg +4 -0
- oasm_dev-0.1.0/src/oasm/dev.py +284 -0
- oasm_dev-0.1.0/src/oasm.dev.egg-info/PKG-INFO +14 -0
- oasm_dev-0.1.0/src/oasm.dev.egg-info/SOURCES.txt +8 -0
- oasm_dev-0.1.0/src/oasm.dev.egg-info/dependency_links.txt +1 -0
- oasm_dev-0.1.0/src/oasm.dev.egg-info/requires.txt +1 -0
- oasm_dev-0.1.0/src/oasm.dev.egg-info/top_level.txt +1 -0
oasm_dev-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: oasm.dev
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Open ASseMbly tools - DEVices
|
|
5
|
+
Author-email: nzturn <nzturn@gmail.com>
|
|
6
|
+
Keywords: asm,dsl
|
|
7
|
+
Classifier: Development Status :: 3 - Alpha
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Requires-Python: >=3.8
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: oasm
|
|
13
|
+
|
|
14
|
+
# Open ASseMbly tools - DEVices
|
oasm_dev-0.1.0/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Open ASseMbly tools - DEVices
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "oasm.dev" # 包名(需确保在PyPI唯一)
|
|
3
|
+
version = "0.1.0" # 初始版本号
|
|
4
|
+
authors = [
|
|
5
|
+
{ name = "nzturn", email = "nzturn@gmail.com" },
|
|
6
|
+
]
|
|
7
|
+
description = "Open ASseMbly tools - DEVices" # 简短描述
|
|
8
|
+
readme = "README.md" # 项目文档
|
|
9
|
+
requires-python = ">=3.8" # 兼容的Python版本
|
|
10
|
+
keywords = ["asm", "dsl"] # 可选:关键词便于搜索
|
|
11
|
+
classifiers = [ # 可选:PyPI分类标签
|
|
12
|
+
"Development Status :: 3 - Alpha",
|
|
13
|
+
"Intended Audience :: Developers",
|
|
14
|
+
"Programming Language :: Python :: 3",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
# 主依赖项
|
|
18
|
+
dependencies = ["oasm"]
|
oasm_dev-0.1.0/setup.cfg
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from . import *
|
|
3
|
+
try:
|
|
4
|
+
from . import rtmq2
|
|
5
|
+
except:
|
|
6
|
+
pass
|
|
7
|
+
|
|
8
|
+
LO = 0xfffff
|
|
9
|
+
HI = 0xfff00000
|
|
10
|
+
|
|
11
|
+
class bus(table):
|
|
12
|
+
def __call__(self, key, *args):
|
|
13
|
+
cfg = self.__dict__.get('cfg',None)
|
|
14
|
+
if cfg not in (None,list):
|
|
15
|
+
asm = rtmq2.asm
|
|
16
|
+
asm.__enter__()
|
|
17
|
+
asm.core = cfg.core
|
|
18
|
+
if len(self) > 0 and self[-1][0].endswith('.'):
|
|
19
|
+
if cfg is list:
|
|
20
|
+
self[-1][0] += key
|
|
21
|
+
else:
|
|
22
|
+
self[-1][0] = self[-1][0][:-1]
|
|
23
|
+
#print(f"sfs('{self[-1][0]}','{key}')")
|
|
24
|
+
rtmq2.sfs(self[-1][0], key)
|
|
25
|
+
elif type(key) is str and key[0] not in '&$':
|
|
26
|
+
if len(self) == 0 or cfg is list:
|
|
27
|
+
super().append([key])
|
|
28
|
+
else:
|
|
29
|
+
self[-1][0] = key
|
|
30
|
+
else:
|
|
31
|
+
args = (key,) + args
|
|
32
|
+
if cfg is list:
|
|
33
|
+
self[-1] += list(args)
|
|
34
|
+
elif len(args) > 0:
|
|
35
|
+
key = self[-1][0]
|
|
36
|
+
func = rtmq2.__dict__.get(key,None)
|
|
37
|
+
if func is None:
|
|
38
|
+
if len(args) == 1:
|
|
39
|
+
#print(f"mov('{key}',{hex(args[0])})")
|
|
40
|
+
rtmq2.mov(key,args[0])
|
|
41
|
+
else:
|
|
42
|
+
#print(f"mov('{key}',({hex(args[0])},{hex(args[1])}))")
|
|
43
|
+
rtmq2.mov(key,args)
|
|
44
|
+
else:
|
|
45
|
+
#print(f'{key}('+','.join(map(hex,args))+')')
|
|
46
|
+
func(*args)
|
|
47
|
+
if cfg not in (None,list):
|
|
48
|
+
try:
|
|
49
|
+
if len(rtmq2.asm) > 0:
|
|
50
|
+
cfg(rtmq2.asm(),dnld=0)
|
|
51
|
+
finally:
|
|
52
|
+
rtmq2.asm.__exit__(0,0,0)
|
|
53
|
+
return self
|
|
54
|
+
def __repr__(self):
|
|
55
|
+
return '\n'.join(i[0]+'('+','.join(map(lambda v:hex(v) if type(v) is int else f"'{v}'",i[1:]))+')' for i in self[:])
|
|
56
|
+
def rtmq2(self):
|
|
57
|
+
if self.__dict__.get('cfg',None) is not list:
|
|
58
|
+
return
|
|
59
|
+
from dsl import rtmq2
|
|
60
|
+
for i in self:
|
|
61
|
+
key = i[0]
|
|
62
|
+
func = rtmq2.__dict__.get(key,None)
|
|
63
|
+
if func is None:
|
|
64
|
+
if '.' in key:
|
|
65
|
+
key,sub = key.split('.')
|
|
66
|
+
#print(f"sfs('{key}','{sub}')")
|
|
67
|
+
rtmq2.sfs(key,sub)
|
|
68
|
+
if len(i) == 2:
|
|
69
|
+
#print(f"mov('{key}',{hex(i[1])})")
|
|
70
|
+
rtmq2.mov(key,i[1])
|
|
71
|
+
elif len(i) == 3:
|
|
72
|
+
#print(f"mov('{key}',({hex(i[1])},{hex(i[2])}))")
|
|
73
|
+
rtmq2.mov(key,i[1:])
|
|
74
|
+
else:
|
|
75
|
+
#print(f'{key}('+','.join(map(hex,i[1:]))+')')
|
|
76
|
+
func(*i[1:])
|
|
77
|
+
|
|
78
|
+
bus = context(table=bus)
|
|
79
|
+
|
|
80
|
+
class bit_field:
|
|
81
|
+
def __init__(self, *args):
|
|
82
|
+
assert len(args) > 0, 'Empty bits field'
|
|
83
|
+
#if len(args) == 1:
|
|
84
|
+
# msk = args[0]
|
|
85
|
+
# sca = int(math.log2(msk & (1 + ~msk)))
|
|
86
|
+
# assert (msk + sca) & msk == 0, 'Non-contiguous bits field'
|
|
87
|
+
#elif len(args) == 2:
|
|
88
|
+
self.rng = (min(args),max(args))
|
|
89
|
+
self.msk = ((1<<(self.rng[1]+1-self.rng[0]))-1)<<self.rng[0]
|
|
90
|
+
|
|
91
|
+
def __get__(self, obj, cls=None):
|
|
92
|
+
if obj is None:
|
|
93
|
+
return self
|
|
94
|
+
return (obj._val & self.msk) >> self.rng[0]
|
|
95
|
+
|
|
96
|
+
def __set__(self, obj, val):
|
|
97
|
+
obj._val &= ~self.msk
|
|
98
|
+
obj._val |= self.msk & (val << self.rng[0])
|
|
99
|
+
|
|
100
|
+
class port:
|
|
101
|
+
def __init__(self, _key=None):
|
|
102
|
+
self._key = self.__class__.__name__ if _key is None else _key
|
|
103
|
+
|
|
104
|
+
def __call__(self, *args, **kwargs):
|
|
105
|
+
bus(self._key)
|
|
106
|
+
if len(args) == 0 and len(kwargs) == 0:
|
|
107
|
+
return
|
|
108
|
+
nargs = len(args)
|
|
109
|
+
for i in args[::-1]:
|
|
110
|
+
if type(i) in (tuple,list):
|
|
111
|
+
nargs -= 1
|
|
112
|
+
else:
|
|
113
|
+
break
|
|
114
|
+
self._val = 0 if nargs < 2 else args[0]
|
|
115
|
+
for i, v in args[nargs:]:
|
|
116
|
+
if type(i) in (tuple,list):
|
|
117
|
+
bit_field(*i).__set__(self,v)
|
|
118
|
+
elif self._val == 0:
|
|
119
|
+
self._val = (v&1)<<i
|
|
120
|
+
else:
|
|
121
|
+
self._val |= (v&1)<<i
|
|
122
|
+
for k, v in kwargs.items():
|
|
123
|
+
setattr(self, k, v)
|
|
124
|
+
if nargs == 0:
|
|
125
|
+
val = self._val
|
|
126
|
+
msk = None
|
|
127
|
+
elif nargs == 1:
|
|
128
|
+
val = args[0]
|
|
129
|
+
msk = self._val if len(args)-nargs+len(kwargs) > 0 else None
|
|
130
|
+
else:
|
|
131
|
+
val = self._val
|
|
132
|
+
msk = args[1]
|
|
133
|
+
if msk is None:
|
|
134
|
+
bus(val)
|
|
135
|
+
else:
|
|
136
|
+
bus(val,msk)
|
|
137
|
+
return self
|
|
138
|
+
|
|
139
|
+
def on(self, *args, **kwargs):
|
|
140
|
+
self._val = 0
|
|
141
|
+
if len(args) > 0:
|
|
142
|
+
for i in args:
|
|
143
|
+
if type(i) in (tuple,list):
|
|
144
|
+
bit_field(*i).__set__(self,-1)
|
|
145
|
+
elif self._val == 0:
|
|
146
|
+
self._val = 1<<i
|
|
147
|
+
else:
|
|
148
|
+
self._val |= 1<<i
|
|
149
|
+
else:
|
|
150
|
+
for k,v in kwargs.items():
|
|
151
|
+
setattr(self, k, -1)
|
|
152
|
+
msk = self._val
|
|
153
|
+
self(-1, msk)
|
|
154
|
+
|
|
155
|
+
def off(self, *args, **kwargs):
|
|
156
|
+
self._val = 0
|
|
157
|
+
if len(args) > 0:
|
|
158
|
+
for i in args:
|
|
159
|
+
if type(i) in (tuple,list):
|
|
160
|
+
bit_field(*i).__set__(self,-1)
|
|
161
|
+
elif self._val == 0:
|
|
162
|
+
self._val = 1<<i
|
|
163
|
+
else:
|
|
164
|
+
self._val |= 1<<i
|
|
165
|
+
else:
|
|
166
|
+
for k,v in kwargs.items():
|
|
167
|
+
setattr(self, k, -1)
|
|
168
|
+
msk = self._val
|
|
169
|
+
self(0, msk)
|
|
170
|
+
|
|
171
|
+
def set(self, *args, **kwargs):
|
|
172
|
+
if len(args) > 0:
|
|
173
|
+
self._val = 0
|
|
174
|
+
for i,v in args:
|
|
175
|
+
if type(i) in (tuple,list):
|
|
176
|
+
bit_field(*i).__set__(self,v)
|
|
177
|
+
elif self._val == 0:
|
|
178
|
+
self._val = (v&1)<<i
|
|
179
|
+
else:
|
|
180
|
+
self._val |= (v&1)<<i
|
|
181
|
+
val = self._val
|
|
182
|
+
self._val = 0
|
|
183
|
+
for i,v in args:
|
|
184
|
+
if type(i) in (tuple,list):
|
|
185
|
+
bit_field(*i).__set__(self,-1)
|
|
186
|
+
elif self._val == 0:
|
|
187
|
+
self._val = 1<<i
|
|
188
|
+
else:
|
|
189
|
+
self._val |= 1<<i
|
|
190
|
+
msk = self._val
|
|
191
|
+
else:
|
|
192
|
+
self._val = 0
|
|
193
|
+
for k, v in kwargs.items():
|
|
194
|
+
setattr(self, k, v)
|
|
195
|
+
val = self._val
|
|
196
|
+
self._val = 0
|
|
197
|
+
for k, v in kwargs.items():
|
|
198
|
+
setattr(self, k, -1)
|
|
199
|
+
msk = self._val
|
|
200
|
+
self(val, msk)
|
|
201
|
+
|
|
202
|
+
class pin:
|
|
203
|
+
def __init__(self,port,sub=None,pos=None):
|
|
204
|
+
self.port = port
|
|
205
|
+
self.sub = sub
|
|
206
|
+
if type(pos) is str:
|
|
207
|
+
pos = getattr(port.__class__,pos,None)
|
|
208
|
+
if type(pos) is bit_field:
|
|
209
|
+
pos = pos.rng
|
|
210
|
+
self.pos = pos
|
|
211
|
+
|
|
212
|
+
def __call__(self, *args):
|
|
213
|
+
if len(args) == 0:
|
|
214
|
+
if self.pos is None:
|
|
215
|
+
return rtmq2.R[self.port._key] if self.sub is None else rtmq2.R[self.port._key][self.sub]
|
|
216
|
+
elif type(self.pos) in (tuple,list):
|
|
217
|
+
return ((rtmq2.R[self.port._key] if self.sub is None else rtmq2.R[self.port._key][self.sub])>>self.pos[0])&((1<<(self.pos[1]+1-self.pos[0]))-1)
|
|
218
|
+
else:
|
|
219
|
+
return ((rtmq2.R[self.port._key] if self.sub is None else rtmq2.R[self.port._key][self.sub])>>self.pos)&1
|
|
220
|
+
else:
|
|
221
|
+
if self.pos is None:
|
|
222
|
+
(self.port if self.sub is None else self.port[self.sub])(*args)
|
|
223
|
+
else:
|
|
224
|
+
(self.port if self.sub is None else self.port[self.sub]).set((self.pos,args[0]))
|
|
225
|
+
|
|
226
|
+
def on(self):
|
|
227
|
+
self(-1)
|
|
228
|
+
|
|
229
|
+
def off(self):
|
|
230
|
+
self(0)
|
|
231
|
+
|
|
232
|
+
class dev:
|
|
233
|
+
def __init__(self, **kwargs):
|
|
234
|
+
for k,v in kwargs.items():
|
|
235
|
+
if isinstance(v,port):
|
|
236
|
+
self.__dict__[k] = v
|
|
237
|
+
|
|
238
|
+
def __setitem__(self, key, val):
|
|
239
|
+
if type(key) is int:
|
|
240
|
+
key = f'&{key:02x}'
|
|
241
|
+
try:
|
|
242
|
+
sub = super().__getattribute__(key)
|
|
243
|
+
except:
|
|
244
|
+
sub = None
|
|
245
|
+
if isinstance(sub,port):
|
|
246
|
+
if isinstance(self, ports):
|
|
247
|
+
bus(self.__class__.__name__+f'.')
|
|
248
|
+
if type(val) is tuple:
|
|
249
|
+
if type(val[-1]) is dict:
|
|
250
|
+
sub(*val[:-1],**val[-1])
|
|
251
|
+
else:
|
|
252
|
+
sub(*val)
|
|
253
|
+
elif type(val) is table:
|
|
254
|
+
sub(*val[:],**val.__dict__)
|
|
255
|
+
else:
|
|
256
|
+
sub(val)
|
|
257
|
+
else:
|
|
258
|
+
object.__setattr__(self, key, val)
|
|
259
|
+
return val
|
|
260
|
+
|
|
261
|
+
def __setattr__(self, key, val):
|
|
262
|
+
try:
|
|
263
|
+
sub = super().__getattribute__(key)
|
|
264
|
+
except:
|
|
265
|
+
sub = None
|
|
266
|
+
if isinstance(sub,port):
|
|
267
|
+
self[key] = val
|
|
268
|
+
else:
|
|
269
|
+
object.__setattr__(self, key, val)
|
|
270
|
+
return val
|
|
271
|
+
|
|
272
|
+
class ports(port,dev):
|
|
273
|
+
def __getattribute__(self, key):
|
|
274
|
+
sub = super().__getattribute__(key)
|
|
275
|
+
if isinstance(sub,port):
|
|
276
|
+
bus(self._key+f'.')
|
|
277
|
+
return sub
|
|
278
|
+
|
|
279
|
+
def __getitem__(self, key):
|
|
280
|
+
bus(self._key+f'.')
|
|
281
|
+
if type(key) is int:
|
|
282
|
+
key = f'&{key:02x}'
|
|
283
|
+
key = str(key)
|
|
284
|
+
return self.__dict__.get(key,port(key))
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: oasm.dev
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Open ASseMbly tools - DEVices
|
|
5
|
+
Author-email: nzturn <nzturn@gmail.com>
|
|
6
|
+
Keywords: asm,dsl
|
|
7
|
+
Classifier: Development Status :: 3 - Alpha
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Requires-Python: >=3.8
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: oasm
|
|
13
|
+
|
|
14
|
+
# Open ASseMbly tools - DEVices
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
oasm
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
oasm
|