Skip to content

Commit 4522caa

Browse files
author
Jorge Aparicio
committed
support registers without fields
1 parent 57e9e72 commit 4522caa

File tree

2 files changed

+120
-69
lines changed

2 files changed

+120
-69
lines changed

ci/run.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ test_mode() {
3939
svd=nrf51.svd
4040
test_gen
4141
test_gen gpio
42+
test_gen timer
4243
}
4344

4445
deploy_mode() {

src/lib.rs

Lines changed: 119 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -357,11 +357,13 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
357357
let access = access(&register);
358358

359359
items.extend(gen_register(register, d));
360-
if access != Access::WriteOnly {
361-
items.extend(gen_register_r(register, d));
362-
}
363-
if access != Access::ReadOnly {
364-
items.extend(gen_register_w(register, d));
360+
if let Some(ref fields) = register.fields {
361+
if access != Access::WriteOnly {
362+
items.extend(gen_register_r(register, d, fields));
363+
}
364+
if access != Access::ReadOnly {
365+
items.extend(gen_register_w(register, d, fields));
366+
}
365367
}
366368
}
367369

@@ -454,13 +456,14 @@ fn type_of(r: &Register) -> String {
454456

455457
fn access(r: &Register) -> Access {
456458
r.access.unwrap_or_else(|| {
457-
let fields = r.fields
458-
.as_ref()
459-
.expect(&format!("{:#?} has no `fields` field", r));
460-
if fields.iter().all(|f| f.access == Some(Access::ReadOnly)) {
461-
Access::ReadOnly
462-
} else if fields.iter().all(|f| f.access == Some(Access::WriteOnly)) {
463-
Access::WriteOnly
459+
if let Some(ref fields) = r.fields {
460+
if fields.iter().all(|f| f.access == Some(Access::ReadOnly)) {
461+
Access::ReadOnly
462+
} else if fields.iter().all(|f| f.access == Some(Access::WriteOnly)) {
463+
Access::WriteOnly
464+
} else {
465+
Access::ReadWrite
466+
}
464467
} else {
465468
Access::ReadWrite
466469
}
@@ -479,8 +482,6 @@ pub fn gen_register(r: &Register, d: &Defaults) -> Vec<Tokens> {
479482
.to_ty();
480483
let access = access(r);
481484

482-
let name_r = Ident::new(format!("{}R", ty));
483-
let name_w = Ident::new(format!("{}W", ty));
484485
match access {
485486
Access::ReadOnly => {
486487
items.push(quote! {
@@ -489,80 +490,130 @@ pub fn gen_register(r: &Register, d: &Defaults) -> Vec<Tokens> {
489490
register: ::volatile_register::RO<#bits_ty>
490491
}
491492
});
492-
493-
items.push(quote! {
494-
impl #name {
495-
pub fn read(&self) -> #name_r {
496-
#name_r { bits: self.register.read() }
497-
}
498-
}
499-
});
500493
}
501-
502494
Access::ReadWrite => {
503495
items.push(quote! {
504496
#[repr(C)]
505497
pub struct #name {
506498
register: ::volatile_register::RW<#bits_ty>
507499
}
508500
});
509-
510-
items.push(quote! {
511-
impl #name {
512-
pub fn modify<F>(&mut self, f: F)
513-
where for<'w> F: FnOnce(&#name_r, &'w mut #name_w) -> &'w mut #name_w,
514-
{
515-
let bits = self.register.read();
516-
let r = #name_r { bits: bits };
517-
let mut w = #name_w { bits: bits };
518-
f(&r, &mut w);
519-
self.register.write(w.bits);
520-
}
521-
522-
pub fn read(&self) -> #name_r {
523-
#name_r { bits: self.register.read() }
524-
}
525-
526-
pub fn write<F>(&mut self, f: F)
527-
where F: FnOnce(&mut #name_w) -> &mut #name_w,
528-
{
529-
let mut w = #name_w::reset_value();
530-
f(&mut w);
531-
self.register.write(w.bits);
532-
}
533-
}
534-
});
535501
}
536-
537502
Access::WriteOnly => {
538503
items.push(quote! {
539504
#[repr(C)]
540505
pub struct #name {
541506
register: ::volatile_register::WO<#bits_ty>
542507
}
543508
});
509+
}
510+
_ => unreachable!(),
511+
}
544512

545-
items.push(quote! {
546-
impl #name {
547-
pub fn write<F>(&self, f: F)
548-
where F: FnOnce(&mut #name_w) -> &mut #name_w,
549-
{
550-
let mut w = #name_w::reset_value();
551-
f(&mut w);
552-
self.register.write(w.bits);
513+
if r.fields.is_some() {
514+
let name_r = Ident::new(format!("{}R", ty));
515+
let name_w = Ident::new(format!("{}W", ty));
516+
match access {
517+
Access::ReadOnly => {
518+
items.push(quote! {
519+
impl #name {
520+
pub fn read(&self) -> #name_r {
521+
#name_r { bits: self.register.read() }
522+
}
553523
}
554-
}
555-
});
524+
});
525+
}
526+
Access::ReadWrite => {
527+
items.push(quote! {
528+
impl #name {
529+
pub fn modify<F>(&mut self, f: F)
530+
where for<'w> F: FnOnce(&#name_r, &'w mut #name_w) -> &'w mut #name_w,
531+
{
532+
let bits = self.register.read();
533+
let r = #name_r { bits: bits };
534+
let mut w = #name_w { bits: bits };
535+
f(&r, &mut w);
536+
self.register.write(w.bits);
537+
}
538+
539+
pub fn read(&self) -> #name_r {
540+
#name_r { bits: self.register.read() }
541+
}
542+
543+
pub fn write<F>(&mut self, f: F)
544+
where F: FnOnce(&mut #name_w) -> &mut #name_w,
545+
{
546+
let mut w = #name_w::reset_value();
547+
f(&mut w);
548+
self.register.write(w.bits);
549+
}
550+
}
551+
});
552+
}
553+
554+
Access::WriteOnly => {
555+
items.push(quote! {
556+
impl #name {
557+
pub fn write<F>(&self, f: F)
558+
where F: FnOnce(&mut #name_w) -> &mut #name_w,
559+
{
560+
let mut w = #name_w::reset_value();
561+
f(&mut w);
562+
self.register.write(w.bits);
563+
}
564+
}
565+
});
566+
}
567+
568+
_ => unreachable!(),
556569
}
570+
} else {
571+
match access {
572+
Access::ReadOnly => {
573+
items.push(quote! {
574+
impl #name {
575+
pub fn read(&self) -> #bits_ty {
576+
self.register.read()
577+
}
578+
}
579+
});
580+
}
581+
Access::ReadWrite => {
582+
items.push(quote! {
583+
impl #name {
584+
pub fn read(&self) -> #bits_ty {
585+
self.register.read()
586+
}
587+
588+
pub fn write(&mut self, value: #bits_ty) {
589+
self.register.write(value);
590+
}
591+
}
592+
});
593+
}
557594

558-
_ => unreachable!(),
595+
Access::WriteOnly => {
596+
items.push(quote! {
597+
impl #name {
598+
pub fn write(&mut self, value: #bits_ty) {
599+
self.register.write(value);
600+
}
601+
}
602+
});
603+
}
604+
605+
_ => unreachable!(),
606+
}
559607
}
560608

561609
items
562610
}
563611

564612
#[doc(hidden)]
565-
pub fn gen_register_r(r: &Register, d: &Defaults) -> Vec<Tokens> {
613+
pub fn gen_register_r(r: &Register,
614+
d: &Defaults,
615+
fields: &[svd::Field])
616+
-> Vec<Tokens> {
566617
let mut items = vec![];
567618

568619
let name = Ident::new(format!("{}R", type_of(r)));
@@ -580,9 +631,7 @@ pub fn gen_register_r(r: &Register, d: &Defaults) -> Vec<Tokens> {
580631

581632
let mut impl_items = vec![];
582633

583-
for field in r.fields
584-
.as_ref()
585-
.expect(&format!("{:#?} has no `fields` field", r)) {
634+
for field in fields {
586635
if let Some(Access::WriteOnly) = field.access {
587636
continue;
588637
}
@@ -643,7 +692,10 @@ pub fn gen_register_r(r: &Register, d: &Defaults) -> Vec<Tokens> {
643692
}
644693

645694
#[doc(hidden)]
646-
pub fn gen_register_w(r: &Register, d: &Defaults) -> Vec<Tokens> {
695+
pub fn gen_register_w(r: &Register,
696+
d: &Defaults,
697+
fields: &[svd::Field])
698+
-> Vec<Tokens> {
647699
let mut items = vec![];
648700

649701
let name = Ident::new(format!("{}W", type_of(r)));
@@ -673,9 +725,7 @@ pub fn gen_register_w(r: &Register, d: &Defaults) -> Vec<Tokens> {
673725
});
674726
}
675727

676-
for field in r.fields
677-
.as_ref()
678-
.expect(&format!("{:#?} has no `fields` field", r)) {
728+
for field in fields {
679729
if let Some(Access::ReadOnly) = field.access {
680730
continue;
681731
}

0 commit comments

Comments
 (0)