\#include "${name}.h" \#include \#include \#include #try #define addrSize ${addrSize} #except 1 #end try class C${name}Impl; typedef shared_ptr ${name}Impl; class C${name}Impl : public CMMIODevImpl, public virtual I${name}B { public: C${name}Impl(Key &key, const char* name); }; #if $varExists('commands') #for $c in $commands class C${c.name}Impl; typedef shared_ptr ${c.name}Impl; class C${c.name}Impl: public CCommandImpl { public: C${c.name}Impl(Key &k, const char* name): CCommandImpl(k, name) {} virtual void executeCommand(Path pParent) const { ${name} dev = I${name}::create( pParent ); dev->${c.name}(); } }; #end for #end if ${name}B I${name}B::create(const char *name) { ${name}Impl v = CShObj::create<${name}Impl>(name); Field f; #if $varExists('commands') #for $c in $commands f = CShObj::create<${c.name}Impl>("${c.name}C"); v->CDevImpl::addAtAddress( f , 1 ); #end for #end if IIntField::Builder bldr = IIntField::IBuilder::create(); #for $p in $registers bldr->reset(); #if $p.has_key('lsBit') bldr->lsBit( ${p.lsBit} ); #else bldr->lsBit( 0 ); #end if #if $p.has_key('size') bldr->sizeBits( ${p.size} ); #else bldr->sizeBits( 32 ); #end if #if $p.type == "Configuration" bldr->mode( IIntField::RW ); #else bldr->mode( IIntField::RO ); #end if f = bldr->build( "${p.name}" ); #if $p.has_key('description') f->setDescription( "${p.description}" ); #end if #if $p.has_key('nelms') v->CMMIODevImpl::addAtAddress( f , ${p.address}*addrSize, ${p.nelms} ); #else v->CMMIODevImpl::addAtAddress( f , ${p.address}*addrSize ); #end if #end for return v; } C${name}Impl::C${name}Impl(Key &key, const char *name) : CMMIODevImpl(key, name, 0x00010000, LE) { } class C${name}Adapt; typedef shared_ptr ${name}Adapt; class C${name}Adapt : public I${name}, public IEntryAdapt { protected: /* put ScalVals, etc. here */ #for $p in $registers #if $p.has_key('sval') ScalVal ${p.name}_; #end if #end for public: C${name}Adapt(Key &k, Path p, shared_ptr ie); public: /* Functions that we will implement */ #if $varExists('commands') /* Commands */ #for $c in $commands virtual void ${c.name}(); #end for #end if }; C${name}Adapt::C${name}Adapt(Key &k, Path p, shared_ptr ie) : IEntryAdapt(k, p, ie) { #for $p in $registers #if $p.has_key('sval') ${p.name}_ = IScalVal::create( p->findByName( "${p.name}" ) ); #end if #end for } #if $varExists('commands') /* Commands */ #for $c in $commands void C${name}Adapt::${c.name}() { throw InternalError("C${name}Adapt::${c.name} not implemented\n"); } #end for #end if ${name} I${name}::create(Path p) { ${name}Adapt rval = IEntryAdapt::check_interface<${name}Adapt, ${name}Impl>(p); return rval; }