X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=3b_sim%2Fccpu.cpp;h=98c0b658f66279cf63d8f20a18e6e995ef8b6500;hb=1968f329b10681b760faec9369aa893cd2af8d44;hp=873f1b7af8160baf9907fe600981e3226f24c0cd;hpb=8f5ad4611ce8bdc9e3288e24252633557f4e950b;p=calu.git diff --git a/3b_sim/ccpu.cpp b/3b_sim/ccpu.cpp index 873f1b7..98c0b65 100644 --- a/3b_sim/ccpu.cpp +++ b/3b_sim/ccpu.cpp @@ -1,3 +1,24 @@ +/* `Deep Thought', a softcore CPU implemented on a FPGA + + Copyright (C) 2010 Markus Hofstaetter + Copyright (C) 2010 Martin Perner + Copyright (C) 2010 Stefan Rebernig + Copyright (C) 2010 Manfred Schwarz + Copyright (C) 2010 Bernhard Urban + + 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 . */ + #include "ccpu.hpp" /* CDat m_pc, m_pc_next; @@ -6,6 +27,50 @@ //void registerExtension() {}; +const char* expression = "(;.*)|(r0)|(rX)|(r1[0-5])|(r[1-5])|(r[6-9])|(0x[a-fA-F0-9]+)|([-]?\\d+)"; +const char* format = "(?1$&)" + //Return-Register: violett + "(?2\033[0m\033[35m$&\033[0m\\3:)" + // Callee-saved Register: rot + "(?4\033[0m\033[31m$&\033[0m\\3:)" + //Argument-Register: gruen + "(?5\033[0m\033[32m$&\033[0m\\3:)" + // Temporary Register: gelb + "(?6\033[0m\033[33m$&\033[0m\\3:)" + // Zahlenwerte: tuerkis + "(?7\033[0m\033[36m$&\033[0m\\3:)" + "(?8\033[0m\033[36m$&\033[0m\\3:)"; + + +string CCpu::colorifyInstr(string instr) +{ + boost::regex e; + e.assign(expression); + return boost::regex_replace(instr, e, format, boost::match_default | boost::format_all); +} + +void CCpu::registerExtension(Iext* ext) +{ + m_exts.push_back(ext); +} + +void CCpu::applyToExtensions(const vector& in) +{ + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + (*iter)->parseInput(in); + } +} + +void CCpu::breakNext() +{ + m_breakNext = true; +} + +bool CCpu::shouldBreak() +{ + return m_breakNext; +} + void CCpu::tick() { // signal extensions @@ -14,16 +79,22 @@ void CCpu::tick() m_pc = m_pc_next; m_pc_next += 4; Iinstr* instr = this->getProg(m_pc); + if(instr == NULL) { throw string("Out of Instructions!"); } + + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + (*iter)->applyTick(); + } + if(this->conditionMet(instr->getCondition())) { - cout << color(green,black) << "Executing: " << color(white,black) << instr->toString() << endl; + cout << color(green,black) << "Executing: " << color(white,black) << colorifyInstr(instr->toString()) << " (0x" << std::hex << m_pc << std::dec << ")" << endl; instr->execInstr(); this->incPerfBy(instr->getClockCount()); } else { - cout << color(red,black) << "Didn't Execute " << color(white,black) << instr->toString() << "; condition wasn't met" << endl; + cout << color(red,black) << "Didn't Execute " << color(white,black) << colorifyInstr(instr->toString()) << "; condition wasn't met" << endl; this->incPerf(); } @@ -165,11 +236,31 @@ void CCpu::setRegister(const int addr, CDat data) CDat CCpu::getRAM(const int addr) const { - return m_ram.get(addr); + if((addr & EXT_MODEL_OFFSET) == 0) { + return m_ram.get(addr); + } + else { + CDat result = 0; + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + result = (*iter)->readData(addr); + if(result != 0) { + break; + } + } + return result; + } } + void CCpu::setRAM(const int addr, CDat data) { - m_ram.set(addr, data); + if((addr & EXT_MODEL_OFFSET) == 0) { + m_ram.set(addr, data); + } + else { + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + (*iter)->loadData(addr, data); + } + } } void CCpu::setProg(int addr, Iinstr* instr) @@ -213,7 +304,7 @@ void CCpu::incPerfBy(short inc) } -CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_stack(0) +CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_breakNext(0), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_exts(0), m_stack(0) { }