copyleft: gplv3 added and set repo to public
[calu.git] / 3b_sim / ccpu.hpp
index 86940a29f1f8743bbae2eb3aa923befbfd709365..9545445af260f6352dbab06636082c897b04e2ab 100644 (file)
@@ -1,3 +1,24 @@
+/*   `Deep Thought', a softcore CPU implemented on a FPGA
+
+    Copyright (C) 2010 Markus Hofstaetter <markus.manrow@gmx.at>
+    Copyright (C) 2010 Martin Perner <e0725782@student.tuwien.ac.at>
+    Copyright (C) 2010 Stefan Rebernig <stefan.rebernig@gmail.com>
+    Copyright (C) 2010 Manfred Schwarz <e0725898@student.tuwien.ac.at>
+    Copyright (C) 2010 Bernhard Urban <lewurm@gmail.com>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
 #ifndef __CPU__H__
 #define __CPU__H__
 
 #include "cmem.hpp"
 #include "cpmem.hpp"
 
+#include "ccolor.h"
+
 class Iinstr;
+class Iext;
 
+#include "iext.hpp"
+#include <boost/regex.hpp>
 #include "Iinstr.hpp"
 
 
 class CCpu {
        private:
 
-               bool m_Z, m_S, m_C, m_O;
+               bool m_Z, m_S, m_C, m_O, m_breakNext;
 
-               CDat m_pc, m_pc_next;
+               CDat m_pc, m_pc_next, m_perf;
                CMem<CDat> m_reg, m_ram;
                CPMem<Iinstr*> m_prog;
 
+               vector<Iext*> m_exts;
+
                CDat m_stack;
 
+               static const int EXT_MODEL_OFFSET = 0x2000;
+
        public:
                void registerExtension() {};
+               void applyToExtensions(const vector<string>& in);
                void tick();
 
+               void breakNext();
+               bool shouldBreak();
+
                CDat getRegister(const int) const;
                void setRegister(const int, CDat);
 
@@ -34,6 +68,13 @@ class CCpu {
                Iinstr* getProg(const int) const;
                void setProg(const int, Iinstr*);
 
+               void registerExtension(Iext*);
+
+               CDat getPerf() const;
+               void setPerf(CDat);
+               void incPerf();
+               void incPerfBy(short);
+
                CDat getCurPC() const;
                CDat getNextPC() const;
                void setNextPC(CDat);
@@ -56,6 +97,8 @@ class CCpu {
                int getStack() const;
                void setStack(const int);
 
+               string colorifyInstr(string instr);
+
                CCpu(int,int,int);
 
 };