Skip to content

Commit 6525c97

Browse files
authored
Merge pull request #167 from kossnikita/write-constraint-register
Write constraint register
2 parents 4e12ba7 + e89942d commit 6525c97

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

src/html/html_cli.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ fn parse_register(
351351
"description": rtag.description.as_deref().map(sanitize),
352352
"resetValue": format!("0x{:08X}", rtag.properties.reset_value.unwrap_or_default()),
353353
"access": raccs,
354+
"writeConstraint": rtag.write_constraint,
354355
"fields": fields,
355356
"table": table,
356357
"fields_total": register_fields_total,

src/html/template.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,15 @@ <h4>
171171
</a>
172172
</h4>
173173
<p>{{ register.description }}</p>
174-
<p>Offset: {{ register.offset }}, size: {{ register.size }}, reset: {{ register.resetValue }}, access: {{ register.access }}</p>
174+
<p>
175+
Offset: {{ register.offset }}, size: {{ register.size }}, reset: {{ register.resetValue }}, access: {{ register.access
176+
}}{% if register.writeConstraint.range %}, allowed values: {{ register.writeConstraint.range.minimum }}-{{ register.writeConstraint.range.maximum }}{% endif %}
177+
</p>
175178
<div class="progress">
176179

177180
<div class="progress-bar progress-bar-success" style="width: {{ register.progress }}%"></div>
178181
</div>
182+
{% if register.fields_total > 0 %}
179183
<p>
180184
<em>
181185
{{ register.fields_documented}}/{{ register.fields_total }}
@@ -215,6 +219,7 @@ <h4>
215219
</div>
216220
</div>
217221
</div>
222+
{% endif %}
218223
<div class="container fields" id="{{ pname }}-{{ register.name }}-fields">
219224
{% for field in register.fields %}
220225
<div class="row">

src/patch/mod.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use svd_parser::svd::{
99
AddressBlockUsage, ClusterInfo, ClusterInfoBuilder, Cpu, CpuBuilder, Endian, EnumeratedValue,
1010
EnumeratedValues, EnumeratedValuesBuilder, FieldInfo, FieldInfoBuilder, Interrupt,
1111
PeripheralInfo, PeripheralInfoBuilder, RegisterCluster, RegisterInfo, RegisterInfoBuilder,
12-
RegisterProperties, Usage, ValidateLevel,
12+
RegisterProperties, Usage, ValidateLevel, WriteConstraint, WriteConstraintRange,
1313
};
1414
use svd_parser::SVDError::DimIndexParse;
1515
use svd_rs::{DimElement, DimElementBuilder, MaybeArray};
@@ -423,6 +423,32 @@ fn make_register(radd: &Hash) -> Result<RegisterInfoBuilder> {
423423
if let Some(address_offset) = radd.get_i64("addressOffset")? {
424424
rnew = rnew.address_offset(address_offset as u32);
425425
}
426+
427+
if let Some(write_constraint) = radd
428+
.get(&"_write_constraint".to_yaml())
429+
.or_else(|| radd.get(&"writeConstraint".to_yaml()))
430+
{
431+
let wc = match write_constraint {
432+
Yaml::String(s) if s == "none" => {
433+
// Completely remove the existing writeConstraint
434+
None
435+
}
436+
Yaml::String(s) if s == "enum" => {
437+
// Only allow enumerated values
438+
Some(WriteConstraint::UseEnumeratedValues(true))
439+
}
440+
Yaml::Array(a) => {
441+
// Allow a certain range
442+
Some(WriteConstraint::Range(WriteConstraintRange {
443+
min: a[0].i64()? as u64,
444+
max: a[1].i64()? as u64,
445+
}))
446+
}
447+
_ => return Err(anyhow!("Unknown writeConstraint type {write_constraint:?}")),
448+
};
449+
rnew = rnew.write_constraint(wc);
450+
}
451+
426452
Ok(rnew)
427453
}
428454

0 commit comments

Comments
 (0)