copyleft: gplv3 added and set repo to public
[calu.git] / 3b_sim / cmem.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 #include "cmem.hpp"
23
24 using namespace std;
25
26 template <typename T>
27 void CMem<T>::set(const MEMORY_ADDRESS address, const T data)
28 {
29         if(address >= MAX_MEMORY) {
30                 stringstream error;
31                 error << "memoryaddress " << address << " out of range";
32                 throw out_of_range(error.str());
33         }
34
35         MEMORY_ADDRESS temp = (address & (~(BYTE_COUNT-1))) / BYTE_COUNT;
36         auto iter = m_memory.begin();
37         while(temp > 0) {
38                 ++iter;
39                 temp--;
40         }
41
42         iter = m_memory.insert(iter, data);
43         ++iter;
44         m_memory.erase(iter);
45 }
46
47 template <typename T>
48 T CMem<T>::get(const MEMORY_ADDRESS address) const
49 {
50         if(address >= MAX_MEMORY) {
51                 stringstream error;
52                 error << "memoryaddress " << address << " out of range";
53                 throw out_of_range(error.str());
54         }
55         MEMORY_ADDRESS temp = (address & (~(BYTE_COUNT-1))) / BYTE_COUNT;
56         return m_memory[temp];
57 }
58
59 template <typename T>
60 void CMem<T>::setDirect(const MEMORY_ADDRESS address, const T data)
61 {
62         if(address >= MAX_MEMORY) {
63                 stringstream error;
64                 error << "memoryaddress " << address << " out of range";
65                 throw out_of_range(error.str());
66         }
67
68         MEMORY_ADDRESS temp = address;
69         auto iter = m_memory.begin();
70         while(temp > 0) {
71                 ++iter;
72                 temp--;
73         }
74
75         iter = m_memory.insert(iter, data);
76         ++iter;
77         m_memory.erase(iter);
78 }
79
80 template <typename T>
81 T CMem<T>::getDirect(const MEMORY_ADDRESS address) const
82 {
83         if(address >= MAX_MEMORY) {
84                 stringstream error;
85                 error << "memoryaddress " << address << " out of range";
86                 throw out_of_range(error.str());
87         }
88         return m_memory[address];
89 }
90
91
92 template class CMem<CDat>;