# UTRA (Unambiguous Thin Register Abstraction) Library Crate
`utralib` is responsible for mapping a hardware target specification
to the set of physical memory locations used by the hardware.
The mapping is derived from an [SVD](https://www.keil.com/pack/doc/CMSIS/SVD/html/svd_Format_pg.html)
file. SVD files are XML descriptions of a set of registers and fields that
has been adopted by LiteX, but is also broadly used by other silicon
vendors such as [ST](https://github.com/tinygo-org/stm32-svd).
Rust strongly discourages [auto-generated source content](https://github.com/rust-lang/cargo/issues/5073)
so this crate pre-generates the various configurations from SVD files
and stores them in the directory "generated".
However, the generated UTRA descriptions will automatically
regenerate if the source SVD files are modified, so during development
one may replace an SVD file and expect that the generated.rs files
should automatically update to reflect the changed SVD file.
## Target selection
Target selection is done with a pair of flags, one which specifies
the general target, and the other which whittles it down to a revision
of the target.
For traditional silicon platforms, the revision almost never changes.
For FPGA platforms, the revision can change and the convention adopted
here is to use the short 32-bit gitrev to specify a revision. Because
the 32-bit namespace is fairly small, the target name is still bundled
in with the revision specifier.
Thus, to fully specify a Precursor target, one will need to pass two
flags:
- `--features precursor`: specifies the target
- `--features precursor-c809403`: specifies the revision
The target specifier is meant to simplify top-level crate decisions
about which module to use to implement hardware features.
The revision is provided for very specific situations where a hardware
feature may or may not be present in a specific revision of an FPGA SoC.
The feature system could also be (ab)used to, for example, specify
an STM32 family and then the specific chip configuration of that family
with the revision.
## Notes for the Maintainer
Before publishing the package, build each of the possible configurations
to ensure the statically generated files are up to date:
```
cargo build
cargo build --no-default-features --features renode
cargo build --no-default-features --features hosted
cargo build --no-default-features --features precursor --features precursor-pvt
cargo build --no-default-features --features atsama5d27
```
This may require manually publishing svd2utra first, since that is
a dependency of this package.