00001
00002 #if !defined(oagFpgaModuleCompiler_P)
00003 #define oagFpgaModuleCompiler_P
00004
00005 #include "oaDesignDB.h"
00006 #include "oagAiGraph.h"
00007 #include "oagFpga.h"
00008 #include "oagFpgaVerilogDesign.h"
00009 #include "oagFpgaManager.h"
00010 #include <list>
00011 #include <set>
00012 #include <string>
00013
00014 using namespace std;
00015
00016 namespace oagFpga {
00017
00018
00019
00020
00026
00027
00028
00029 class ModuleCompiler{
00030
00031 protected:
00032
00035
00036 static void scalarNet2Ai(oa::oaModBitNet* net);
00037 static void busNet2Ai(oa::oaModBusNet* bus);
00038 static void compileOneModule(oa::oaModule *module);
00039 static void compileFunctionalBBNode(BBRef e);
00040 static void compileFunctionalMuxBBNode(RtlNode* bbNode);
00041 static void compileFunctionalSeqBBNode(RtlNode* bbNode);
00042 static void compileFunctionalOptBBNode(RtlNode* bbNode);
00043 static void compileBBNode(BBRef e);
00044 static oagAi::Ref BBRef2AiRef(BBRef e);
00045 static void BBRef2AiRef(BBRef e, vector<oagAi::Ref>& aiRefs);
00046 static void BBRef2AiRef(list<BBRef> &e, list<oagAi::Ref>& aiRefs);
00047
00048 public:
00049
00050 static void compileModules(oa::oaLib *lib, oa::oaView *view);
00051
00052 public:
00053
00057
00058 static void annotateAsynchronousSignal(oagAi::Ref sequential,
00059 const string label,
00060 oagAi::Ref signal);
00061
00065
00066 static oagAi::Ref notOf(oagAi::Ref e);
00067 static oagAi::Ref orOf(oagAi::Ref e1, oagAi::Ref e2);
00068 static oagAi::Ref andOf(oagAi::Ref e1, oagAi::Ref e2);
00069 static oagAi::Ref xorOf(oagAi::Ref e1, oagAi::Ref e2);
00070 static oagAi::Ref mux(oagAi::Ref select, oagAi::Ref in0, oagAi::Ref in1);
00071 static void fullAdder(oagAi::Ref &sum, oagAi::Ref &carryOut,
00072 oagAi::Ref e1, oagAi::Ref e2, oagAi::Ref carryIn);
00073
00077
00078 static oagAi::Ref reductionOr(list<oagAi::Ref> &l);
00079 static oagAi::Ref reductionXor(list<oagAi::Ref> &l);
00080 static oagAi::Ref reductionAnd(list<oagAi::Ref> &l);
00081 static oagAi::Ref lessThan(list<oagAi::Ref> &l1, list<oagAi::Ref> &l2);
00082 static oagAi::Ref equalTo(list<oagAi::Ref> &l1, list<oagAi::Ref> &l2);
00083 static void mux(list<oagAi::Ref> &result, oagAi::Ref select,
00084 list<oagAi::Ref> &in0, list<oagAi::Ref> &in1);
00085 static oagAi::Ref mux(list<oagAi::Ref> &select, list<oagAi::Ref> &in);
00086
00090
00091 static void arithmeticAdd(list<oagAi::Ref> &result, list<oagAi::Ref> &l1,
00092 list<oagAi::Ref> &l2);
00093 static void arithmeticSubtract(list<oagAi::Ref> &result, oagAi::Ref &negFlag,
00094 list<oagAi::Ref> &l1, list<oagAi::Ref> &l2);
00095 static void arithmeticMultiply(list<oagAi::Ref> &result,
00096 list<oagAi::Ref> &l1, list<oagAi::Ref> &l2);
00097 static void arithmeticDivide(list<oagAi::Ref> &result, list<oagAi::Ref> &l1,
00098 list<oagAi::Ref> &l2);
00099 static void arithmeticModulo(list<oagAi::Ref> &result,
00100 list<oagAi::Ref> &l1, list<oagAi::Ref> &l2);
00101
00105
00106 static oagAi::Ref latch(oagAi::Ref enable, oagAi::Ref in, const string name = "");
00107 static oagAi::Ref seq(oagAi::Ref in, const string name = "");
00108
00112
00113 static void zeroExpand(list<oagAi::Ref> &l1, list<oagAi::Ref> &l2);
00114 static void multiBitConstant(list<oagAi::Ref> &result, int value, int bits = 0);
00115
00119
00120 static Manager *currentManager;
00121
00123
00124 };
00125
00126 }
00127
00128 #endif