00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "compile_sched.hh"
00025 #include "floats.hh"
00026 #include "ppsig.hh"
00027
00028 extern int gVecSize;
00029
00030 void SchedulerCompiler::compileMultiSignal (Tree L)
00031 {
00032
00033 L = prepare(L);
00034
00035 for (int i = 0; i < fClass->inputs(); i++) {
00036 fClass->addZone3(subst("$1* input$0 = &input[$0][fIndex];", T(i), xfloat()));
00037 }
00038 for (int i = 0; i < fClass->outputs(); i++) {
00039 fClass->addZone3(subst("$1* output$0 = &output[$0][fIndex];", T(i), xfloat()));
00040 }
00041
00042 fClass->addSharedDecl("fullcount");
00043 fClass->addSharedDecl("input");
00044 fClass->addSharedDecl("output");
00045
00046 for (int i = 0; isList(L); L = tl(L), i++) {
00047 Tree sig = hd(L);
00048 fClass->openLoop("count");
00049 fClass->addExecCode(subst("output$0[i] = $2$1;", T(i), CS(sig), xcast()));
00050 fClass->closeLoop();
00051 }
00052
00053
00054 fClass->buildTasksList();
00055
00056 generateUserInterfaceTree(prepareUserInterfaceTree(fUIRoot));
00057 generateMacroInterfaceTree("", prepareUserInterfaceTree(fUIRoot));
00058 if (fDescription) {
00059 fDescription->ui(prepareUserInterfaceTree(fUIRoot));
00060 }
00061 }
00062
00063
00073 void SchedulerCompiler::vectorLoop (const string& tname, const string& vecname, const string& cexp)
00074 {
00075
00076 fClass->addSharedDecl(vecname);
00077
00078
00079 fClass->addDeclCode(subst("$0 \t$1[$2];", tname, vecname, T(gVecSize)));
00080
00081
00082 fClass->addExecCode(subst("$0[i] = $1;", vecname, cexp));
00083 }
00084
00085
00095 void SchedulerCompiler::dlineLoop (const string& tname, const string& dlname, int delay, const string& cexp)
00096 {
00097 if (delay < gMaxCopyDelay) {
00098
00099
00100
00101
00102 string buf = subst("$0_tmp", dlname);
00103 string pmem= subst("$0_perm", dlname);
00104
00105
00106 delay = (delay+3)&-4;
00107
00108
00109 string dsize = T(delay);
00110 fClass->addDeclCode(subst("$0 \t$1[$2];", tname, pmem, dsize));
00111
00112
00113 fClass->addInitCode(subst("for (int i=0; i<$1; i++) $0[i]=0;", pmem, dsize));
00114
00115
00116
00117
00118 fClass->addSharedDecl(buf);
00119
00120
00121 fClass->addDeclCode(subst("$0 \t$1[$2+$3];", tname, buf, T(gVecSize), dsize));
00122
00123 fClass->addFirstPrivateDecl(dlname);
00124 fClass->addZone2(subst("$0* \t$1 = &$2[$3];", tname, dlname, buf, dsize));
00125
00126
00127 fClass->addPreCode(subst("for (int i=0; i<$2; i++) $0[i]=$1[i];", buf, pmem, dsize));
00128
00129
00130 fClass->addExecCode(subst("$0[i] = $1;", dlname, cexp));
00131
00132
00133 fClass->addPostCode(subst("for (int i=0; i<$2; i++) $0[i]=$1[count+i];", pmem, buf, dsize));
00134
00135 } else {
00136
00137
00138
00139
00140 delay = pow2limit(delay + gVecSize);
00141 string dsize = T(delay);
00142 string mask = T(delay-1);
00143
00144
00145 string idx = subst("$0_idx", dlname);
00146 string idx_save = subst("$0_idx_save", dlname);
00147
00148
00149 fClass->addDeclCode(subst("$0 \t$1[$2];", tname, dlname, dsize));
00150 fClass->addDeclCode(subst("int \t$0;", idx));
00151 fClass->addDeclCode(subst("int \t$0;", idx_save));
00152
00153
00154 fClass->addInitCode(subst("for (int i=0; i<$1; i++) $0[i]=0;", dlname, dsize));
00155 fClass->addInitCode(subst("$0 = 0;", idx));
00156 fClass->addInitCode(subst("$0 = 0;", idx_save));
00157
00158
00159 fClass->addPreCode(subst("$0 = ($0+$1)&$2;", idx, idx_save, mask));
00160
00161
00162 fClass->addExecCode(subst("$0[($2+i)&$3] = $1;", dlname, cexp, idx, mask));
00163
00164
00165 fClass->addPostCode(subst("$0 = count;", idx_save));
00166 }
00167 }