NSVD Reader  0.0.1
CMSIS5-SVD Reader

C++ Header only CMSIS5 SVD read library.

This is an unofficial library.


read How to read svd file

include
// select xml reader
read
namespace svd=nodamushi::svd;
svd::boost_svd_reader svd_reader(file_name);
svd::Device<> device(svd_reader);
See also
nodamushi::svd::Device
nodamushi::svd::Cpu
nodamushi::svd::Peripheral
nodamushi::svd::Register
nodamushi::svd::Field
nodamushi::svd::Cluster
nodamushi::svd::boost_svd_reader
nodamushi::svd::expat_svd_reader
nodamushi::svd::tinyxml_svd_reader

How to resolve 'derivedFrom' attributes

add include file.

#include "nodamushi/svd/normalize.hpp"

code

//* device is nodamushi::svd::Device
//* namespace svd = nodamushi::svd;
auto dptr = svd::normalize(device);
See also
nodamushi::svd::normalized::Device
nodamushi::svd::normalized::Cpu
nodamushi::svd::normalized::Peripheral
nodamushi::svd::normalized::Register
nodamushi::svd::normalized::Field
nodamushi::svd::normalized::Cluster

How to use visitor pattern.

TODO: document

see 'sample/visitor_sample.cpp'.


Sample code

#include <string>
#include <iostream>
#include "nodamushi/svd/normalize.hpp"
// select xml reader
//#include "nodamushi/svd/expat.hpp"
//#include "nodamushi/svd/tinyxml.hpp"
// visitor pattern
struct visitor
{
using this_t = visitor;
#undef VISITOR_MEMBER
#define VISITOR_MEMBER
//-------------------------------
{
if(i.name && i.value)
std::cout << "interrupt:" <<*i.name << "," << *i.value<<std::endl;
return result::CONTINUE;
}
{
count_register++;
return result::CONTINUE;
}
int count_register=0;
};
int main(int argc,char** argv)
{
std::string filename = argv[1];
// read svd
namespace svd=nodamushi::svd;
svd::boost_svd_reader svd(filename);
svd::Device<> device(svd);
// edit data
device.vendor = "Foo Bar.inc";
device.description = "Foo Bar";
// print SVD(xml)
std::cout << device << std::endl;
// get cpu name
if(device.cpu && device.cpu->name){
std::cout <<"Device CPU:"<< device.cpu->name.get() << std::endl;
}else{
std::cout << "Device CPU is not defined" << std::endl;
}
// use visitor pattern
visitor v;
visitor::accept(device,v);
// normalize (resovle 'derivedFrom')
namespace norm =nodamushi::svd::normalized;
auto dptr = svd::normalize(device);
// dptr is std::shared_ptr<norm::Device<std::string/std::string_view>>
if(auto p = dptr->find_peripheral("UART2")){
for(auto& r:p->registers){
std::cout << "UART2 Register:"
<< r.name << ","
<< r.get_address() << std::endl;
}
}
}