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.
@@ -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
+ # 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"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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,8 @@
1
+ README.md
2
+ pyproject.toml
3
+ src/oasm/dev.py
4
+ src/oasm.dev.egg-info/PKG-INFO
5
+ src/oasm.dev.egg-info/SOURCES.txt
6
+ src/oasm.dev.egg-info/dependency_links.txt
7
+ src/oasm.dev.egg-info/requires.txt
8
+ src/oasm.dev.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ oasm