Skip to content

Commit dcaf59e

Browse files
committed
derive array
1 parent 569e544 commit dcaf59e

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

src/patch/peripheral.rs

+15-6
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,10 @@ pub(crate) trait RegisterBlockExt: Name {
248248
/// Update all derivedFrom referencing rname
249249
fn derive_register(&mut self, rspec: &str, rderive: &Yaml, bpath: &BlockPath) -> PatchResult {
250250
let (rspec, ignore) = rspec.spec();
251-
let (rderive, info) = if let Some(rderive) = rderive.as_str() {
251+
let (rderive, dim, info) = if let Some(rderive) = rderive.as_str() {
252252
(
253253
rderive,
254+
None,
254255
RegisterInfo::builder().derived_from(Some(rderive.into())),
255256
)
256257
} else if let Some(hash) = rderive.as_hash() {
@@ -259,6 +260,7 @@ pub(crate) trait RegisterBlockExt: Name {
259260
})?;
260261
(
261262
rderive,
263+
make_dim_element(hash)?,
262264
make_register(hash, Some(bpath))?.derived_from(Some(rderive.into())),
263265
)
264266
} else {
@@ -281,14 +283,21 @@ pub(crate) trait RegisterBlockExt: Name {
281283
let rtags = self.iter_registers(rspec).collect::<Vec<_>>();
282284
let mut found = Vec::new();
283285
if !rtags.is_empty() {
284-
for register in rtags {
285-
found.push(register.name.to_string());
286-
register.modify_from(info.clone(), VAL_LVL)?;
286+
for rtag in rtags {
287+
found.push(rtag.name.to_string());
288+
modify_dim_element(rtag, &dim)?;
289+
rtag.modify_from(info.clone(), VAL_LVL)?;
287290
}
288291
} else if !ignore {
289292
super::check_dimable_name(rspec)?;
290-
let register = info.name(rspec.into()).build(VAL_LVL)?.single();
291-
self.add_child(RegisterCluster::Register(register));
293+
let reg = info.name(rspec.into()).build(VAL_LVL)?;
294+
self.add_child(RegisterCluster::Register({
295+
if let Some(dim) = dim {
296+
reg.array(dim.build(VAL_LVL)?)
297+
} else {
298+
reg.single()
299+
}
300+
}));
292301
}
293302
for rname in found {
294303
for r in self

src/patch/register.rs

+20-7
Original file line numberDiff line numberDiff line change
@@ -369,25 +369,38 @@ impl RegisterExt for Register {
369369
}
370370
}
371371
let (fspec, ignore) = fspec.spec();
372-
let info = if let Some(dpath) = fderive.as_str() {
373-
FieldInfo::builder().derived_from(Some(make_path(dpath, rpath)))
372+
let (dim, info) = if let Some(dpath) = fderive.as_str() {
373+
(
374+
None,
375+
FieldInfo::builder().derived_from(Some(make_path(dpath, rpath))),
376+
)
374377
} else if let Some(hash) = fderive.as_hash() {
375378
let dpath = hash.get_str("_from")?.ok_or_else(|| {
376379
anyhow!("derive: source field not given, please add a _from field to {fspec}")
377380
})?;
378-
make_field(hash, Some(rpath))?.derived_from(Some(make_path(dpath, rpath)))
381+
(
382+
make_dim_element(hash)?,
383+
make_field(hash, Some(rpath))?.derived_from(Some(make_path(dpath, rpath))),
384+
)
379385
} else {
380386
return Err(anyhow!("derive: incorrect syntax for {fspec}"));
381387
};
382388
let ftags = self.iter_fields(fspec).collect::<Vec<_>>();
383389
if !ftags.is_empty() {
384-
for field in ftags {
385-
field.modify_from(info.clone(), VAL_LVL)?;
390+
for ftag in ftags {
391+
modify_dim_element(ftag, &dim)?;
392+
ftag.modify_from(info.clone(), VAL_LVL)?;
386393
}
387394
} else if !ignore {
388395
super::check_dimable_name(fspec)?;
389-
let field = info.name(fspec.into()).build(VAL_LVL)?.single();
390-
self.fields.get_or_insert(Vec::new()).push(field);
396+
let field = info.name(fspec.into()).build(VAL_LVL)?;
397+
self.fields.get_or_insert(Vec::new()).push({
398+
if let Some(dim) = dim {
399+
field.array(dim.build(VAL_LVL)?)
400+
} else {
401+
field.single()
402+
}
403+
});
391404
}
392405
Ok(())
393406
}

0 commit comments

Comments
 (0)