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) {
219 EmbeddedcCodeGenerator::AX EmbeddedcCodeGenerator::IntegerQuotient(
const AX& expression,
int val) {
220 return AX(expression +
" / " + IntegerConstant(val));
224 EmbeddedcCodeGenerator::AX EmbeddedcCodeGenerator::IntegerRemainder(
const AX& expression,
int val) {
225 return AX(expression +
" % " + IntegerConstant(val));
230 return AX(
"(" + WordConstant(1) +
" << " + expression +
")" );
235 return AX(
TargetAddress(address) +
" == " + IntegerConstant(val));
239 CodePrimitives::AX EmbeddedcCodeGenerator::IntegerIsEq(
const AA& address,
const AX& expression) {
244 CodePrimitives::AX EmbeddedcCodeGenerator::IntegerIsNotEq(
const AA& address,
const AX& expression) {
249 CodePrimitives::AX EmbeddedcCodeGenerator::IntegerIsNotEq(
const AA& address,
int val) {
250 return AX(
TargetAddress(address) +
" != " + IntegerConstant(val));
254 CodePrimitives::AX EmbeddedcCodeGenerator::IntegerIsGreater(
const AA& address,
int val) {
255 return AX(
TargetAddress(address) +
" > " + IntegerConstant(val));
259 CodePrimitives::AX EmbeddedcCodeGenerator::IntegerIsLess(
const AA& address,
int val) {
260 return AX(
TargetAddress(address) +
" < " + IntegerConstant(val));
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");
371 CodePrimitives::AX EmbeddedcCodeGenerator::WordIsMaskSet(
const AA& address, word_t mask) {
372 return AX(
"( " +
TargetAddress(address) +
" & " + WordConstant(mask) +
" ) != 0");
377 return AX(
TargetAddress(address) +
" == " + WordConstant(val));
381 CodePrimitives::AX EmbeddedcCodeGenerator::WordIsNotEq(
const AA& address, word_t val) {
382 return AX(
TargetAddress(address) +
" != " + WordConstant(val));
386 EmbeddedcCodeGenerator::AX EmbeddedcCodeGenerator::WordConstant(word_t val) {
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 <<
"]");
409 EmbeddedcCodeGenerator::AX EmbeddedcCodeGenerator::StringConstant(
const std::string& val) {
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 <<
"]");
430 EmbeddedcCodeGenerator::AX EmbeddedcCodeGenerator::IntarrayConstant(
const std::vector<int>& val) {
431 std::stringstream strstr;
433 if(val.size()<25) newline=25;
437 if(vit==val.size())
break;
438 strstr << IntegerConstant(val[vit]);
440 if(vit==val.size())
break;
444 strstr << std::endl <<
" ";
449 return AX(strstr.str());
453 void EmbeddedcCodeGenerator::CintarrayDeclare(
const AA& address,
const std::vector<int>& val) {
455 FCG_ERR(
"EmbeddedcCodeGenerator::Cintarray(): ignoring empty const vector");
459 FCG_ERR(
"EmbeddedcCodeGenerator::Cintarray(): const vector exceeds addres range");
465 Output() << IntarrayConstant(val) <<
";";
472 return AA(address +
"[" + ToStringInteger(index) +
"]");
481 bool EmbeddedcCodeGenerator::HasCintarray(
void) {
487 EmbeddedcCodeGenerator::AX EmbeddedcCodeGenerator::WordarrayConstant(
const std::vector<word_t>& val) {
488 std::stringstream strstr;
490 if(val.size()<25) newline=25;
494 if(vit==val.size())
break;
495 strstr << WordConstant(val[vit]);
497 if(vit==val.size())
break;
501 strstr << std::endl <<
" ";
506 return AX(strstr.str());
510 void EmbeddedcCodeGenerator::CwordarrayDeclare(
const AA& address,
const std::vector<word_t>& val) {
512 FCG_ERR(
"EmbeddedcCodeGenerator::Cwordarray(): ignoring empty const vector");
516 FCG_ERR(
"EmbeddedcCodeGenerator::Cwordarray(): const vector exceeds addres range");
521 Output() << WordarrayConstant(val) <<
";";
528 return AA(address +
"[" + ToStringInteger(index) +
"]");
537 bool EmbeddedcCodeGenerator::HasCwordarray(
void) {
544 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): ignoring empty const vector");
548 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): vector exceeds address range");
553 Output() << IntarrayConstant(val) <<
";";
561 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): ignoring empty const vector");
565 FCG_ERR(
"EmbeddedcCodeGenerator::Intarray(): const vector exceeds address range");
574 return AA(address +
"[" + ToStringInteger(index) +
"]");
588 void EmbeddedcCodeGenerator::WordarrayDeclare(
const AA& address,
const std::vector<word_t>& val) {
590 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): ignoring empty const vector");
594 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): const vector exceeds addres range");
599 Output() << WordarrayConstant(val) <<
";";
605 void EmbeddedcCodeGenerator::WordarrayDeclare(
const AA& address,
int len) {
607 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): ignoring empty const vector");
611 FCG_ERR(
"EmbeddedcCodeGenerator::Wordarray(): const vector exceeds addres range");
620 return AA(address +
"[" + ToStringInteger(index) +
"]");
629 bool EmbeddedcCodeGenerator::HasWordarray(
void) {
634 EmbeddedcCodeGenerator::AX EmbeddedcCodeGenerator::StrarrayConstant(
const std::vector<std::string>& val) {
635 std::stringstream strstr;
642 strstr <<
"{" << std::endl;
646 if(vit==val.size())
break;
647 strstr << StringConstant(val[vit]);
649 if(vit==val.size())
break;
658 return AX(strstr.str());
662 void EmbeddedcCodeGenerator::CstrarrayDeclare(
const AA& address,
const std::vector<std::string>& val) {
664 FCG_ERR(
"EmbeddedcCodeGenerator::Cstrarrayy(): ignoring empty string array");
668 FCG_ERR(
"EmbeddedcCodeGenerator::Cstrarray(): string array exceeds address range");
673 Output() << StrarrayConstant(val) <<
";";
680 return AA(address +
"[" + ToStringInteger(index) +
"]");
689 bool EmbeddedcCodeGenerator::HasCstrarray(
void) {
695 void EmbeddedcCodeGenerator::IfTrue(
const AX& expression) {
696 Output() <<
"if( " << expression <<
" ) {";
702 void EmbeddedcCodeGenerator::IfFalse(
const AX& expression) {
703 Output() <<
"if( ! ( " << expression <<
" ) ) {";
709 void EmbeddedcCodeGenerator::IfWord(
const AX& expression) {
710 Output() <<
"if( " << expression <<
" ) {";
716 void EmbeddedcCodeGenerator::IfElse(
void) {
724 void EmbeddedcCodeGenerator::IfElseIfTrue(
const AX& expression) {
726 Output() <<
"} else if( " << expression <<
" ) {";
732 void EmbeddedcCodeGenerator::IfEnd(
void) {
739 void EmbeddedcCodeGenerator::SwitchBegin(
const AA& address){
745 void EmbeddedcCodeGenerator::SwitchCase(
const AA& address,
int val){
747 Output() <<
"case " << IntegerConstant(val) <<
":";
753 void EmbeddedcCodeGenerator::SwitchCases(
const AA& address,
int from,
int to){
756 SwitchCase(address, from);
760 for(
int val=from; val<=to; ++val) {
761 Output() <<
"case " << IntegerConstant(val) <<
":";
768 void EmbeddedcCodeGenerator::SwitchCases(
const AA& address,
const std::set< int >& vals){
771 std::set< int >::const_iterator vit=vals.begin();
772 for(; vit!=vals.end(); ++ vit) {
773 Output() <<
"case " << IntegerConstant(*vit) <<
":";
780 void EmbeddedcCodeGenerator::SwitchBreak(
void){
787 void EmbeddedcCodeGenerator::SwitchEnd(
void){
799 bool EmbeddedcCodeGenerator::HasMultiCase(
void) {
804 void EmbeddedcCodeGenerator::LoopBegin(
void) {
811 void EmbeddedcCodeGenerator::LoopBreak(
const AX& expression) {
812 Output() <<
"if( " << expression <<
" ) break;";
818 void EmbeddedcCodeGenerator::LoopEnd(
void) {
824 void EmbeddedcCodeGenerator::FunctionReturn(
void) {
831 void EmbeddedcCodeGenerator::TimerDeclare(
const AA& address,
const std::string& litval) {
834 const char* first = litval.c_str();
835 strtol(first,&next,10);
837 if(*next!=
'f') err=
true;
838 if(!err)
if(*(++next)!=
't') err=
true;
839 if(!err)
if(*(++next)!=
'u') err=
true;
840 if(!err)
if(*(++next)!=0) err=
true;
842 FCG_ERR(
"EmbeddedcCodeGenerator: missmatched time literal "+ litval);
849 void EmbeddedcCodeGenerator::TimerStart(
const AA& address) {
853 void EmbeddedcCodeGenerator::TimerStop(
const AA& address) {
857 void EmbeddedcCodeGenerator::TimerReset(
const AA& address,
const std::string& litval) {
858 int val=(int) strtol(litval.c_str(),NULL,10);
859 Output() <<
TargetAddress(AA(
"timer_"+address+
"_cnt")) <<
" = " << IntegerConstant(val) <<
";";
868 void EmbeddedcCodeGenerator::RunActionSet(
const std::string& address) {
869 Output() << address <<
" = 1;" ;
872 void EmbeddedcCodeGenerator::RunActionClr(
const std::string& address) {
873 Output() << address <<
" = 0;" ;
876 void EmbeddedcCodeGenerator::RunActionExe(
const AX& expression) {
877 Output() << expression <<
";";