32 FD_DCG(
"EmbeddedcCodeGenerator(" <<
this <<
")::EmbeddedcCodeGenerator()");
38 FD_DCG(
"EmbeddedcCodeGenerator(" <<
this <<
")::~EmbeddedcCodeGenerator()");
43 FD_DCG(
"EmbeddedcCodeGenerator::Clear()");
56 FD_DCG(
"EmbeddedcCodeGenerator::DoReadTargetConfiguration()");
63 FD_DCG(
"EmbeddedcCodeGenerator::DoWriteTargetConfiguration()");
74 FCG_VERB1(
"EmbeddedcCodeGenerator::Compile(): prefer compiled bitmasks over bit-address maths");
82 FD_DCG(
"EmbeddedcCodeGenerator(" <<
this <<
")::DoGenerate()");
86 Comment(
"************************************************");
87 Comment(
"CodeGenerator: Target Embedded C ");
88 Comment(
"************************************************");
102 Output() <<
"}; /* end function " <<
mPrefix <<
"cyclic() */";
109 Comment(
"************************************************");
110 Comment(
"CodeGenerator: Generated Code Ends Here ");
111 Comment(
"************************************************");
121 Comment(
"************************************************");
122 Comment(
"* update timer states *");
123 Comment(
"************************************************");
131 <<
TargetAddress(
AA(
"timer_" + tit->second.mAddress +
"_cnt")) <<
" -= dec;";
163 Output() <<
"/* " << text <<
" */";
173 std::string res=
mPrefix+address;
183 void EmbeddedcCodeGenerator::IntegerDeclare(
const AA& address){
189 void EmbeddedcCodeGenerator::IntegerDeclare(
const AA& address,
int val){
195 void EmbeddedcCodeGenerator::IntegerAssign(
const AA& address,
int val){
201 void EmbeddedcCodeGenerator::IntegerAssign(
const AA& address,
const AX& expression){
207 void EmbeddedcCodeGenerator::IntegerIncrement(
const AA& address,
int val) {
220 return AX(expression +
" / " + IntegerConstant(val));
225 return AX(expression +
" % " + IntegerConstant(val));
230 return AX(
"(" + WordConstant(1) +
" << " + expression +
")" );
264 bool EmbeddedcCodeGenerator::HasIntmaths(
void) {
270 AX res(ToStringInteger(val));
278 FCG_ERR(
"EmbeddedcCodeGenerator: unsupported integer data type [" <<
mIntegerType <<
"]");
283 void EmbeddedcCodeGenerator::WordDeclare(
const AA& address){
289 void EmbeddedcCodeGenerator::WordDeclare(
const AA& address,
word_t val){
295 void EmbeddedcCodeGenerator::WordAssign(
const AA& address,
word_t val){
301 void EmbeddedcCodeGenerator::WordAssign(
const AA& address,
const AX& expression){
307 void EmbeddedcCodeGenerator::WordOr(
const AA& address,
word_t val) {
313 void EmbeddedcCodeGenerator::WordOr(
const AA& address,
const AX& expression) {
319 void EmbeddedcCodeGenerator::WordOr(
const AA& address,
const AA& op1,
const AA& op2) {
325 void EmbeddedcCodeGenerator::WordOr(
const AA& address,
const AA& op1,
word_t op2) {
331 void EmbeddedcCodeGenerator::WordAnd(
const AA& address,
word_t val) {
337 void EmbeddedcCodeGenerator::WordAnd(
const AA& address,
const AX& expression) {
343 void EmbeddedcCodeGenerator::WordAnd(
const AA& address,
const AA& op1,
const AA& op2) {
349 void EmbeddedcCodeGenerator::WordAnd(
const AA& address,
const AA& op1,
word_t op2) {
355 void EmbeddedcCodeGenerator::WordNand(
const AA& address,
const AX& expression) {
362 return AX(
"( " +
TargetAddress(address) +
" & " + WordConstant(0x01<<idx) +
" ) != 0");
367 return AX(
"( " +
TargetAddress(address) +
" & " + WordConstant(0x01<<idx) +
" ) == 0");
372 return AX(
"( " +
TargetAddress(address) +
" & " + WordConstant(mask) +
" ) != 0");
388 std::stringstream sstr;
389 sstr <<
"0x" << std::setbase(16) << std::setfill(
'0');
391 if(val==0) sstr << std::setw(2);
393 if(
mWordType ==
"unsigned char") { sstr << std::setw(2); val &=0xff; }
395 if(
mWordType ==
"unsigned char") sstr << val;
396 else if(
mWordType ==
"uint8_t") sstr << ((uint8_t) val) <<
"U";
397 else if(
mWordType ==
"unsigned short") sstr << ((
unsigned short) val) <<
"U";
398 else if(
mWordType ==
"unsigned int") sstr << ((
unsigned int) val) <<
"U";
399 else if(
mWordType ==
"uint16_t") sstr << ((uint16_t) val) <<
"U";
400 else if(
mWordType ==
"unsigned long") sstr << ((
unsigned long) val) <<
"UL";
401 else if(
mWordType ==
"uint32_t") sstr << ((uint32_t) val) <<
"UL";
402 else if(
mWordType ==
"unsigned long long") sstr << ((
unsigned long long) val) <<
"ULL";
403 else FCG_ERR(
"EmbeddedcCodeGenerator: unsupported word data type [" <<
mWordType <<
"]");
412 for(std::size_t i=0; i<val.length(); ++i) {
417 if(c==
'"') { res.append(
"\\\"");
continue; }
419 if(c==
'\\') { res.append(
"\\\\");
continue; }
421 if((c>=0x20) && (c<0x7f)) { res.append(1,c);
continue; };
423 FCG_ERR(
"EmbeddedcCodeGenerator: non-printable ascii or other encoding unsupported [" << val <<
"]");
431 std::stringstream strstr;
433 if(val.size()+offset<25) newline=25;
437 if(vit==val.size()+offset)
break;
438 if(vit< (
size_t) offset)
439 strstr << IntegerConstant(0);
441 strstr << IntegerConstant(val[vit-offset]);
443 if(vit==val.size()+offset)
break;
447 strstr << std::endl <<
" ";
452 return AX(strstr.str());
456 void EmbeddedcCodeGenerator::CintarrayDeclare(
const AA& address,
int offset,
const std::vector<int>& val) {
458 FCG_ERR(
"EmbeddedcCodeGenerator::Cintarray(): ignoring empty const vector");
462 FCG_ERR(
"EmbeddedcCodeGenerator::Cintarray(): const vector exceeds addres range");
465 const std::vector<int> *pval=&val;
467 std::vector<int> oval(val.size()+offset,0);
468 for(
size_t i=0; i<val.size(); ++i)
469 oval[offset+i]=val[i];
475 Output() << IntarrayConstant(offset,val) <<
";";
482 return AA(address +
"[" + ToStringInteger(index) +
"]");
491 bool EmbeddedcCodeGenerator::HasCintarray(
void) {
498 std::stringstream strstr;
500 if(val.size()+offset<25) newline=25;
504 if(vit==val.size()+offset)
break;
505 if(vit < (
size_t) offset)
506 strstr << WordConstant(0);
508 strstr << WordConstant(val[vit-offset]);
510 if(vit==val.size()+offset)
break;
514 strstr << std::endl <<
" ";
519 return AX(strstr.str());
523 void EmbeddedcCodeGenerator::CwordarrayDeclare(
const AA& address,
int offset,
const std::vector<word_t>& val) {
525 FCG_ERR(
"EmbeddedcCodeGenerator::Cwordarray(): ignoring empty const vector");
529 FCG_ERR(
"EmbeddedcCodeGenerator::Cwordarray(): const vector exceeds addres range");
534 Output() << WordarrayConstant(offset,val) <<
";";
541 return AA(address +
"[" + ToStringInteger(index) +
"]");
550 bool EmbeddedcCodeGenerator::HasCwordarray(
void) {
557 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): ignoring empty const vector");
561 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): vector exceeds address range");
566 Output() << IntarrayConstant(offset,val) <<
";";
574 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): ignoring empty const vector");
578 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): const vector exceeds address range");
587 return AA(address +
"[" + ToStringInteger(index) +
"]");
601 void EmbeddedcCodeGenerator::WordarrayDeclare(
const AA& address,
int offset,
const std::vector<word_t>& val) {
603 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): ignoring empty const vector");
607 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): const vector exceeds addres range");
612 Output() << WordarrayConstant(offset,val) <<
";";
618 void EmbeddedcCodeGenerator::WordarrayDeclare(
const AA& address,
int offset,
int len) {
620 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): ignoring empty const vector");
624 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): const vector exceeds addres range");
633 return AA(address +
"[" + ToStringInteger(index) +
"]");
642 bool EmbeddedcCodeGenerator::HasWordarray(
void) {
648 std::stringstream strstr;
650 if(val.size()+offset <4) {
655 strstr <<
"{" << std::endl;
659 if(vit==val.size()+offset)
break;
660 if(vit < (
size_t)offset)
661 strstr << StringConstant(
"");
663 strstr << StringConstant(val[vit-offset]);
665 if(vit==val.size()+offset)
break;
674 return AX(strstr.str());
678 void EmbeddedcCodeGenerator::CstrarrayDeclare(
const AA& address,
int offset,
const std::vector<std::string>& val) {
680 FCG_ERR(
"EmbeddedcCodeGenerator::Cstrarrayy(): ignoring empty string array");
684 FCG_ERR(
"EmbeddedcCodeGenerator::Cstrarray(): string array exceeds address range");
689 Output() << StrarrayConstant(offset,val) <<
";";
696 return AA(address +
"[" + ToStringInteger(index) +
"]");
705 bool EmbeddedcCodeGenerator::HasCstrarray(
void) {
711 void EmbeddedcCodeGenerator::IfTrue(
const AX& expression) {
712 Output() <<
"if( " << expression <<
" ) {";
718 void EmbeddedcCodeGenerator::IfFalse(
const AX& expression) {
719 Output() <<
"if( ! ( " << expression <<
" ) ) {";
725 void EmbeddedcCodeGenerator::IfWord(
const AX& expression) {
726 Output() <<
"if( " << expression <<
" ) {";
732 void EmbeddedcCodeGenerator::IfElse(
void) {
740 void EmbeddedcCodeGenerator::IfElseIfTrue(
const AX& expression) {
742 Output() <<
"} else if( " << expression <<
" ) {";
748 void EmbeddedcCodeGenerator::IfEnd(
void) {
755 void EmbeddedcCodeGenerator::SwitchBegin(
const AA& address){
761 void EmbeddedcCodeGenerator::SwitchCase(
const AA& address,
int val){
763 Output() <<
"case " << IntegerConstant(val) <<
":";
769 void EmbeddedcCodeGenerator::SwitchCases(
const AA& address,
int from,
int to){
772 SwitchCase(address, from);
776 for(
int val=from; val<=to; ++val) {
777 Output() <<
"case " << IntegerConstant(val) <<
":";
784 void EmbeddedcCodeGenerator::SwitchCases(
const AA& address,
const std::set< int >& vals){
787 std::set< int >::const_iterator vit=vals.begin();
788 for(; vit!=vals.end(); ++ vit) {
789 Output() <<
"case " << IntegerConstant(*vit) <<
":";
796 void EmbeddedcCodeGenerator::SwitchBreak(
void){
803 void EmbeddedcCodeGenerator::SwitchEnd(
void){
815 bool EmbeddedcCodeGenerator::HasMultiCase(
void) {
820 void EmbeddedcCodeGenerator::LoopBegin(
void) {
827 void EmbeddedcCodeGenerator::LoopBreak(
const AX& expression) {
828 Output() <<
"if( " << expression <<
" ) break;";
834 void EmbeddedcCodeGenerator::LoopEnd(
void) {
840 void EmbeddedcCodeGenerator::FunctionReturn(
void) {
847 void EmbeddedcCodeGenerator::TimerDeclare(
const AA& address,
const std::string& litval) {
850 const char* first = litval.c_str();
851 strtol(first,&next,10);
853 if(*next!=
'f') err=
true;
854 if(!err)
if(*(++next)!=
't') err=
true;
855 if(!err)
if(*(++next)!=
'u') err=
true;
856 if(!err)
if(*(++next)!=0) err=
true;
858 FCG_ERR(
"EmbeddedcCodeGenerator: missmatched time literal "+ litval);
865 void EmbeddedcCodeGenerator::TimerStart(
const AA& address) {
869 void EmbeddedcCodeGenerator::TimerStop(
const AA& address) {
873 void EmbeddedcCodeGenerator::TimerReset(
const AA& address,
const std::string& litval) {
874 int val=(int) strtol(litval.c_str(),NULL,10);
884 void EmbeddedcCodeGenerator::RunActionSet(
const std::string& address) {
885 Output() << address <<
" = 1;" ;
888 void EmbeddedcCodeGenerator::RunActionClr(
const std::string& address) {
889 Output() << address <<
" = 0;" ;
892 void EmbeddedcCodeGenerator::RunActionExe(
const AX& expression) {
893 Output() << expression <<
";";
#define FAUDES_REGISTERCODEGENERATOR(ftype, ctype)
Class registration macro.
void InsertExecHooks(void)
Helper to insert target code for execution hooks.
virtual void DoGenerateCyclicCode(void)
cut-and-paste template for code snippet assembly
Abstract expression; see also Absstract_Addresses.
virtual std::ostream & Output(void)
Output stream.
virtual void Comment(const std::string &text)
Target comments (see EmbeddedcCodeGenerator for consistent reimplementation pattern) ...
virtual void DoGenerateResetCode(void)
cut-and-paste template for code snippet assembly
int mWordSize
compressed boolean capacity of target type word
virtual void DoWriteTargetConfiguration(TokenWriter &rTw) const
File i/o.
EmbeddedcCodeGenerator(void)
Constructor.
virtual void LineFeed(int lines=1)
LineFeed (convenience support for derived classes)
Implementation of code primitives by generic C-code.
virtual std::string TargetAddress(const AA &address)
abstract address conversion
virtual void DecrementTimers(void)
re-implemented/additional code blocks
void DoGenerate(void)
virtual hook for generate
virtual void Clear(void)
Clear all data.
std::map< std::string, TimerConfiguration >::iterator TimerIterator
Access to timer records by iterator.
virtual void IndentInc()
Indentation (convenience support for derived classes)
bool mArrayForBitmasks
code option: use const array to represent bit-masks
std::string mStateUpdateHook
code option: state change hook
virtual void DoGenerateDeclarations(void)
cut-and-paste template for code snippet assembly
void DoCompile(void)
add my preferences to DoCompile
virtual void DoReadTargetConfiguration(TokenReader &rTr)
re-implement token i/o for extra configuration
static std::string VersionString(void)
Version (refers to macro COMPILEDES_VERSION, defined in cgp_codegenerator.h)
std::string mIntegerType
target data type for integer
virtual void DoCompile(void)
virtual hook to extend compiled data
virtual void LiteralAppend(void)
Cosmetic: append literally from configuration.
virtual void DoReadTargetConfiguration(TokenReader &rTr)
File i/o.
virtual const std::string & Name(void) const
Get objects's name (reimplementing base faudes::Type)
int mIntegerSize
compressed boolean capacity of target type integer
std::string mWordType
target data type for word
virtual AA IntarrayAccess(const AA &address, int index)
default int-array: not supported
virtual void Clear(void)
Clear all data.
virtual void DoWriteTargetConfiguration(TokenWriter &rTw) const
re-implement token i/o for extra configuration
unsigned long word_t
Code-generator internal data type of target words.
virtual bool HasIntarray(void)
default int-array: not supported
std::string mEventExecutionHook
code option: event exec hook
Abstract address; see also Absstract_Addresses.
virtual AX TargetExpression(const AA &address)
abstract address conversion
std::string mPrefix
universal prefix (pseudo name space)
virtual void IntarrayDeclare(const AA &address, int offset, int len)
default int-array: not supported
virtual void IndentDec()
Indentation (convenience support for derived classes)
TimerIterator TimersBegin()
Access to timer records by iterator.
Code-generator for target C.
std::map< std::string, bitarray_rec > mBitarrays
Record of all declared bit-arrays.
virtual ~EmbeddedcCodeGenerator(void)
Explicit destructor.
virtual void LiteralPrepend(void)
Cosmetic: prepend literally from configuration data.
bool mMuteComments
mute comments
bool mBitAddressArithmetic
code option: compute bit and word address on target
virtual void Comment(const std::string &text)
Target comments (see EmbeddedcCodeGenerator for consistent reimplementation pattern) ...
Execution semantics in terms of code primitives.
TimerIterator TimersEnd()
Access to timer records by iterator.