copyleft: gplv3 added and set repo to public
[calu.git] / 3b_sim / cpmem.cpp
1 /*   `Deep Thought', a softcore CPU implemented on a FPGA
2
3     Copyright (C) 2010 Markus Hofstaetter <markus.manrow@gmx.at>
4     Copyright (C) 2010 Martin Perner <e0725782@student.tuwien.ac.at>
5     Copyright (C) 2010 Stefan Rebernig <stefan.rebernig@gmail.com>
6     Copyright (C) 2010 Manfred Schwarz <e0725898@student.tuwien.ac.at>
7     Copyright (C) 2010 Bernhard Urban <lewurm@gmail.com>
8
9     This program is free software: you can redistribute it and/or modify
10     it under the terms of the GNU General Public License as published by
11     the Free Software Foundation, either version 3 of the License, or
12     (at your option) any later version.
13
14     This program is distributed in the hope that it will be useful,
15     but WITHOUT ANY WARRANTY; without even the implied warranty of
16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17     GNU General Public License for more details.
18
19     You should have received a copy of the GNU General Public License
20     along with this program.  If not, see <http://www.gnu.org/licenses/>. */
21
22
23 //i'm sorry
24 //pervert forwarding
25 //didn't know (or was to lazy) to find another fix
26 #define __CPU__H__
27 class CCpu;
28
29 #include "cpmem.hpp"
30
31 using namespace std;
32
33 template <typename T>
34 void CPMem<T>::set(const MEMORY_ADDRESS address, const T data)
35 {
36         if(address >= MAX_MEMORY) {
37                 stringstream error;
38                 error << "memoryaddress " << address << " out of range";
39                 throw out_of_range(error.str());
40         }
41
42         MEMORY_ADDRESS temp = (address & (~(BYTE_COUNT-1))) / BYTE_COUNT;
43         auto iter = m_memory.begin();
44         while(temp > 0) {
45                 ++iter;
46                 temp--;
47         }
48
49         iter = m_memory.insert(iter, data);
50         ++iter;
51         m_memory.erase(iter);
52 }
53
54 template <typename T>
55 T CPMem<T>::get(const MEMORY_ADDRESS address) const
56 {
57         if(address >= MAX_MEMORY) {
58                 stringstream error;
59                 error << "memoryaddress " << address << " out of range";
60                 throw out_of_range(error.str());
61         }
62         MEMORY_ADDRESS temp = (address & (~(BYTE_COUNT-1))) / BYTE_COUNT;
63         return m_memory[temp];
64 }
65
66 template <typename T>
67 CPMem<T>::~CPMem()
68 {
69         for(auto iter = m_memory.begin(); iter != m_memory.end(); ++iter) {
70                 delete (*iter);
71         }
72 }
73
74
75 template class CPMem<Iinstr*>;