Skip to content

Commit b9605ec

Browse files
bors[bot]burrbull
andauthored
Merge #123
123: mmaps derivedFrom markers r=adamgreig a=burrbull Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents 53f7f2a + 5627f87 commit b9605ec

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

.github/workflows/ci.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ jobs:
4040
- esp8266
4141
- stm32
4242
- lpc55
43-
- rp2040
43+
#- rp2040
4444
steps:
4545
- name: Checkout code
4646
uses: actions/checkout@v3

src/mmap/mmap_cli.rs

+25-7
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ fn get_interrupts(peripheral: &Peripheral, mmap: &mut Vec<String>) {
7878
}
7979
}
8080

81+
fn derived_str(dname: &Option<String>) -> String {
82+
if let Some(dname) = dname.as_ref() {
83+
format!(" (={dname})")
84+
} else {
85+
String::new()
86+
}
87+
}
88+
8189
fn get_registers(
8290
base_address: u64,
8391
registers: Option<&Vec<RegisterCluster>>,
@@ -95,19 +103,24 @@ fn get_registers(
95103
Register::Single(r) => {
96104
let addr = str_utils::format_address(first_addr);
97105
let rname = r.name.to_string() + suffix;
98-
let text = format!("{addr} B REGISTER {rname}{access}: {description}");
106+
let derived = derived_str(&r.derived_from);
107+
let text = format!(
108+
"{addr} B REGISTER {rname}{derived}{access}: {description}"
109+
);
99110
mmap.push(text);
100111
get_fields(r, &addr, mmap);
101112
}
102113
Register::Array(r, d) => {
114+
let derived = derived_str(&r.derived_from);
103115
for (i, idx) in d.indexes().enumerate() {
104116
let addr = str_utils::format_address(
105117
first_addr + (i as u64) * (d.dim_increment as u64),
106118
);
107119
let rname = r.name.replace("%s", &idx);
108120
let description = description.replace("%s", &idx);
109-
let text =
110-
format!("{addr} B REGISTER {rname}{access}: {description}");
121+
let text = format!(
122+
"{addr} B REGISTER {rname}{derived}{access}: {description}"
123+
);
111124
mmap.push(text);
112125
get_fields(r, &addr, mmap);
113126
}
@@ -121,17 +134,20 @@ fn get_registers(
121134
Cluster::Single(c) => {
122135
let addr = str_utils::format_address(first_addr);
123136
let cname = &c.name;
124-
let text = format!("{addr} B CLUSTER {cname}: {description}");
137+
let derived = derived_str(&c.derived_from);
138+
let text = format!("{addr} B CLUSTER {cname}{derived}: {description}");
125139
mmap.push(text);
126140
get_registers(first_addr, Some(&c.children), "", mmap);
127141
}
128142
Cluster::Array(c, d) => {
143+
let derived = derived_str(&c.derived_from);
129144
for (i, idx) in d.indexes().enumerate() {
130145
let caddr = first_addr + (i as u64) * (d.dim_increment as u64);
131146
let addr = str_utils::format_address(caddr);
132147
let cname = c.name.replace("%s", &idx);
133148
let description = description.replace("%s", &idx);
134-
let text = format!("{addr} B CLUSTER {cname}: {description}");
149+
let text =
150+
format!("{addr} B CLUSTER {cname}{derived}: {description}");
135151
mmap.push(text);
136152
get_registers(caddr, Some(&c.children), &idx, mmap);
137153
}
@@ -153,18 +169,20 @@ fn get_fields(register: &RegisterInfo, addr: &str, mmap: &mut Vec<String>) {
153169
let bit_offset = f.bit_range.offset;
154170
let bit_width = f.bit_range.width;
155171
let fname = &f.name;
172+
let derived = derived_str(&f.derived_from);
156173
let text = format!(
157-
"{addr} C FIELD {bit_offset:02}w{bit_width:02} {fname}{access}: {description}"
174+
"{addr} C FIELD {bit_offset:02}w{bit_width:02} {fname}{derived}{access}: {description}"
158175
);
159176
mmap.push(text);
160177
}
161178
Field::Array(f, d) => {
179+
let derived = derived_str(&f.derived_from);
162180
for (i, idx) in d.indexes().enumerate() {
163181
let bit_offset = f.bit_range.offset + (i as u32) * d.dim_increment;
164182
let bit_width = f.bit_range.width;
165183
let fname = f.name.replace("%s", &idx);
166184
let text = format!(
167-
"{addr} C FIELD {bit_offset:02}w{bit_width:02} {fname}{access}: {description}"
185+
"{addr} C FIELD {bit_offset:02}w{bit_width:02} {fname}{derived}{access}: {description}"
168186
);
169187
mmap.push(text);
170188
}

svdtools/mmap.py

+22-4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ def get_int(node, tag, default=None):
9494
return int(text, 10)
9595

9696

97+
def derived_str(dname):
98+
if dname is None:
99+
return ""
100+
else:
101+
return f" (={dname})"
102+
103+
97104
def expand_dim(node, field=False):
98105
"""
99106
Given a node (a cluster, a register or a field) which may have a `dim` child,
@@ -167,25 +174,29 @@ def parse_register(rtag):
167174
rdesc = get_string(rtag, "description")
168175
raccess = get_access(rtag)
169176
roffset = get_int(rtag, "addressOffset")
177+
r_derived = derived_str(rtag.attrib.get("derivedFrom", None))
170178
for ftag in iter_fields(rtag):
171179
for ftag in expand_dim(ftag, field=True):
172180
fname = get_string(ftag, "name")
173181
foffset, fwidth = get_field_offset_width(ftag)
174182
fdesc = get_string(ftag, "description")
175183
faccess = get_access(ftag)
184+
f_derived = derived_str(ftag.attrib.get("derivedFrom", None))
176185
fields[fname] = {
177186
"name": fname,
178187
"offset": foffset,
179188
"width": fwidth,
180189
"description": fdesc,
181190
"access": faccess,
191+
"derived": f_derived,
182192
}
183193
return {
184194
"name": rname,
185195
"offset": roffset,
186196
"description": rdesc,
187197
"access": raccess,
188198
"fields": fields,
199+
"derived": r_derived,
189200
}
190201

191202

@@ -218,10 +229,16 @@ def parse(svdfile):
218229
cname = get_string(ctag, "name")
219230
cdesc = get_string(ctag, "description")
220231
coff = get_int(ctag, "addressOffset")
232+
c_derived = derived_str(ctag.attrib.get("derivedFrom", None))
221233
for rtag in expand_cluster(ctag):
222234
register = parse_register(rtag)
223235
registers[register["name"]] = register
224-
clusters[cname] = {"name": cname, "description": cdesc, "offset": coff}
236+
clusters[cname] = {
237+
"name": cname,
238+
"description": cdesc,
239+
"offset": coff,
240+
"derived": c_derived,
241+
}
225242
for rtag in iter_registers(ptag):
226243
for rtag in expand_dim(rtag):
227244
register = parse_register(rtag)
@@ -263,19 +280,20 @@ def to_text(device):
263280
for c in p["clusters"].values():
264281
addr = p["base"] + c["offset"]
265282
mmap.append(
266-
f"0x{addr:08X} B CLUSTER {c['name']}: " + f"{c['description']}"
283+
f"0x{addr:08X} B CLUSTER {c['name']}{c['derived']}: "
284+
+ f"{c['description']}"
267285
)
268286
for r in p["registers"].values():
269287
addr = p["base"] + r["offset"]
270288
mmap.append(
271-
f"0x{addr:08X} B REGISTER {r['name']}{r['access']}: "
289+
f"0x{addr:08X} B REGISTER {r['name']}{r['derived']}{r['access']}: "
272290
+ f"{r['description']}"
273291
)
274292
for f in r["fields"].values():
275293
offset, width = f["offset"], f["width"]
276294
mmap.append(
277295
f"0x{addr:08X} C FIELD {offset:02d}w{width:02d} "
278-
+ f"{f['name']}{f['access']}: "
296+
+ f"{f['name']}{f['derived']}{f['access']}: "
279297
+ f"{f['description']}"
280298
)
281299
return "\n".join(sorted(mmap))

0 commit comments

Comments
 (0)