]> AND Private Git Repository - blast.git/blob - DelayInputModifier.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
db89107a4614a9a9bad39bde1cac761a8c562329
[blast.git] / DelayInputModifier.cpp
1 #include "DelayInputModifier.h"\r
2 #include "ConnectedInterface.h"\r
3 #include "AbstractBlock.h"\r
4 \r
5 DelayInputModifier::DelayInputModifier(ConnectedInterface *_associatedInterface, int _delayLength) : AbstractInputModifier(_associatedInterface) {\r
6   setDelayLength(_delayLength);\r
7 }\r
8 \r
9 void DelayInputModifier::setDelayLength(int _delayLength) {\r
10   if (_delayLength < 1) _delayLength = 1;\r
11   delayLength = _delayLength;\r
12 }\r
13 \r
14 QList<char>* DelayInputModifier::getModifiedInput(QList<char>* input) {\r
15 \r
16   pattern->clear();\r
17   for(int i=0;i<delayLength;i++) pattern->append(0);\r
18   pattern->append(*input);\r
19   return pattern;\r
20 }\r
21 \r
22 QString DelayInputModifier::toVHDL(int context, int flags) throw(Exception) {\r
23 \r
24 \r
25   ConnectedInterface* fromCtlIface = associatedIface->getConnectedFrom();\r
26   ConnectedInterface* fromIface = AI_TO_CON(fromCtlIface->getAssociatedIface());\r
27 \r
28   ConnectedInterface* toCtlIface = associatedIface;\r
29   ConnectedInterface* toIface = AI_TO_CON(toCtlIface->getAssociatedIface());\r
30   QString toName = toIface->getOwner()->getName()+"_"+toIface->getName();\r
31   QString toCtlName = toCtlIface->getOwner()->getName()+"_"+toCtlIface->getName();\r
32   QString dm2 = "";\r
33   QString dm3 = "";\r
34   dm2.setNum(delayLength-2);\r
35   dm3.setNum(delayLength-3);\r
36   QString ret="";\r
37   QString clkName = "clk";\r
38   QString resetName = "reset";\r
39   if (toIface->getOwner()->getParent()->isTopGroupBlock()) {\r
40     clkName = "from_clkrstgen_clk";\r
41     resetName ="from_clkrstgen_reset";\r
42   }\r
43 \r
44   if (context == Architecture) {\r
45     ret = toName + "_mod_process : process("+clkName+","+resetName+")\n";\r
46     ret += "  begin\n";\r
47     ret += "    if "+resetName+" = '1' then\n";\r
48     ret += "      "+toName+"_dly     <= (others => (others => '0'));\n";\r
49     ret += "      "+toCtlName+"_dly  <= (others => '0');\n";\r
50     ret += "      "+toName+"_mod     <= (others => '0');\n";\r
51     ret += "      "+toCtlName+"_mod  <= '0';\n";\r
52     ret += "    elsif rising_edge("+clkName+") then\n";\r
53     ret += "      "+toName+"_mod <= "+toName+"_dly("+dm2+");\n";\r
54     ret += "      "+toCtlName+"_mod  <= "+toCtlName+"_dly("+dm2+");\n";\r
55     ret += "      "+toName+"_dly(0)  <= "+fromIface->toVHDL(AbstractInterface::Instance,0)+";\n";\r
56     ret += "      "+toCtlName+"_dly(0)  <= "+fromCtlIface->toVHDL(AbstractInterface::Instance,0)+";\n";\r
57     ret += "      "+toName+"_dly(1 to "+dm2+")  <= "+toName+"_dly(0 to "+dm3+");\n";\r
58     ret += "      "+toCtlName+"_dly(1 to "+dm2+")  <= "+toCtlName+"_dly(0 to "+dm3+");\n";\r
59     ret += "    end if;\n";\r
60     ret += "  end process "+toName + "_mod_process;\n";\r
61   }\r
62   else if (context == Signal) {\r
63     QString sig = toIface->toVHDL(AbstractInterface::Signal,0);\r
64     sig.replace(" : ","_mod : ");\r
65     ret = "  signal "+sig+"\n";\r
66     sig = toCtlIface->toVHDL(AbstractInterface::Signal,0);\r
67     sig.replace(" : ","_mod : ");\r
68     ret += "  signal "+sig+"\n";\r
69     QString wStr="";\r
70     wStr.setNum(toIface->getWidth());\r
71     ret += "  signal "+toName+"_dly :  vector_of_std_logic_vector"+wStr+"(0 to "+dm2+");\n";\r
72     ret += "  signal "+toCtlName+"_dly :  vector_of_std_logic(0 to "+dm2+");\n";\r
73   }\r
74 \r
75   return ret;\r
76 \r
77 }\r
78 \r
79 QString DelayInputModifier::getTypeStr() {\r
80   return "delay";\r
81 }\r
82 \r
83 QString DelayInputModifier::getParametersStr() {\r
84   return QString::number(delayLength);\r
85 }\r
86 \r
87 bool DelayInputModifier::isDelay() {\r
88   return true;\r
89 }\r