OSDN Git Service

* public snapshot of sid simulator
[pf3gnuchains/pf3gnuchains3x.git] / sid / component / cgen-cpu / cgen-cpu.h
1 // -*- C++ -*-
2 // Copyright (C) 2000 Red Hat
3
4 #ifndef CGEN_CPU_H
5 #define CGEN_CPU_H
6
7 #include <sidcomp.h>
8 #include <sidso.h>
9 #include <sidtypes.h>
10 #include <sidcomputil.h>
11 #include <sidattrutil.h>
12 #include <sidpinutil.h>
13 #include <sidbusutil.h>
14 #include <sidcpuutil.h>
15 #include <sidwatchutil.h>
16 #include <sidmiscutil.h>
17 #include <sidpinattrutil.h>
18
19 #include "cgen-types.h"
20 #include "cgen-ops.h"
21 #include "cgen-engine.h"
22
23 #include <vector>
24 #include <string>
25 #include <cstdlib>
26 #include <ctime>
27 #include <unistd.h>
28
29
30 using namespace std;
31 using namespace sid;
32 using namespace sidutil;
33
34 namespace cgen 
35 {
36
37   // Mix-in class for cgen cpus.
38   // For simplicity, assume they are all bi-endian.
39 class cgen_bi_endian_cpu: public basic_bi_endian_cpu
40 {
41 protected:
42   // Types of supported engines.  Not all cpus support all engines.
43   enum engine_type {
44     ENGINE_UNKNOWN, ENGINE_SIMPLE, ENGINE_SCACHE, ENGINE_PBB
45   };
46   engine_type engine_type;
47   virtual string get_engine_type ();
48   virtual component::status set_engine_type (const string& s);
49
50 public:
51   // true -> print execution debugging messages
52   // [what it is is at the programmer's whim]
53   bool debug_exec_p;
54
55   // Print messages here.  
56   // XXX: Should be a pointer or somesuch, so it can be changed during a run.
57   ostream& trace_stream;
58   // Cover fns to start/end insn tracing.
59   void begin_trace (PCADDR pc, const char* insn_name);
60   void end_trace ();
61
62 public:
63   cgen_bi_endian_cpu();
64   ~cgen_bi_endian_cpu();
65
66 public:
67   // rtl memory access methods
68   inline QI
69   GETMEMQI(PCADDR pc, ADDR addr) const
70     {
71       return this->read_data_memory_1 (pc, addr);
72     }
73   inline void
74   SETMEMQI(PCADDR pc, ADDR addr, QI value) const
75     {
76       return this->write_data_memory_1 (pc, addr, value);
77     }
78   inline HI
79   GETMEMHI(PCADDR pc, ADDR addr) const
80     {
81       return this->read_data_memory_2 (pc, addr);
82     }
83   inline void
84   SETMEMHI(PCADDR pc, ADDR addr, HI value) const
85     {
86       return this->write_data_memory_2 (pc, addr, value);
87     }
88   inline SI
89   GETMEMSI(PCADDR pc, ADDR addr) const
90     {
91       return this->read_data_memory_4 (pc, addr);
92     }
93   inline void
94   SETMEMSI(PCADDR pc, ADDR addr, SI value) const
95     {
96       return this->write_data_memory_4 (pc, addr, value);
97     }
98   inline USI
99   GETMEMUSI(PCADDR pc, ADDR addr) const
100     {
101       return this->read_data_memory_4 (pc, addr);
102     }
103   inline void
104   SETMEMUSI(PCADDR pc, ADDR addr, USI value) const
105     {
106       return this->write_data_memory_4 (pc, addr, value);
107     }
108   inline DI
109   GETMEMDI(PCADDR pc, ADDR addr) const
110     {
111       return this->read_data_memory_8 (pc, addr);
112     }
113   inline void
114   SETMEMDI(PCADDR pc, ADDR addr, DI value) const
115     {
116       return this->write_data_memory_8 (pc, addr, value);
117     }
118   inline QI
119   GETIMEMQI(PCADDR pc, IADDR addr) const
120     {
121       return this->read_insn_memory_1 (pc, addr);
122     }
123   inline void
124   SETIMEMQI(PCADDR pc, ADDR addr, QI value) const
125     {
126       return this->write_insn_memory_1 (pc, addr, value);
127     }
128   inline UQI
129   GETIMEMUQI(PCADDR pc, IADDR addr) const
130     {
131       return this->read_insn_memory_1 (pc, addr);
132     }
133   inline void
134   SETIMEMUQI(PCADDR pc, ADDR addr, UQI value) const
135     {
136       return this->write_insn_memory_1 (pc, addr, value);
137     }
138   inline HI
139   GETIMEMHI(PCADDR pc, IADDR addr) const
140     {
141       return this->read_insn_memory_2 (pc, addr);
142     }
143   inline void
144   SETIMEMHI(PCADDR pc, ADDR addr, HI value) const
145     {
146       return this->write_insn_memory_2 (pc, addr, value);
147     }
148   inline UHI
149   GETIMEMUHI(PCADDR pc, IADDR addr) const
150     {
151       return this->read_insn_memory_2 (pc, addr);
152     }
153   inline void
154   SETIMEMUHI(PCADDR pc, ADDR addr, UHI value) const
155     {
156       return this->write_insn_memory_2 (pc, addr, value);
157     }
158   inline SI
159   GETIMEMSI(PCADDR pc, IADDR addr) const
160     {
161       return this->read_insn_memory_4 (pc, addr);
162     }
163   inline void
164   SETIMEMSI(PCADDR pc, ADDR addr, SI value) const
165     {
166       return this->write_insn_memory_4 (pc, addr, value);
167     }
168   inline USI
169   GETIMEMUSI(PCADDR pc, IADDR addr) const
170     {
171       return this->read_insn_memory_4 (pc, addr);
172     }
173   inline void
174   SETIMEMUSI(PCADDR pc, ADDR addr, USI value) const
175     {
176       return this->write_insn_memory_4 (pc, addr, value);
177     }
178   inline DI
179   GETIMEMDI(PCADDR pc, IADDR addr) const
180     {
181       return this->read_insn_memory_8 (pc, addr);
182     }
183   inline void
184   SETIMEMDI(PCADDR pc, ADDR addr, DI value) const
185     {
186       return this->write_insn_memory_8 (pc, addr, value);
187     }
188   inline UDI
189   GETIMEMUDI(PCADDR pc, IADDR addr) const
190     {
191       return this->read_insn_memory_8 (pc, addr);
192     }
193   inline void
194   SETIMEMUDI(PCADDR pc, ADDR addr, UDI value) const
195     {
196       return this->write_insn_memory_8 (pc, addr, value);
197     }
198 };
199
200 \f
201 // Virtual insn support.
202
203 // Canonical ids of virtual insns.
204 enum virtual_insn_type {
205   VIRTUAL_INSN_INVALID,
206   VIRTUAL_INSN_BEGIN,
207   VIRTUAL_INSN_COND,
208   VIRTUAL_INSN_CHAIN, VIRTUAL_INSN_CTI_CHAIN,
209   VIRTUAL_INSN_BEFORE, VIRTUAL_INSN_AFTER,
210 };
211
212 } // namespace cgen
213
214 #endif /* CGEN_CPU_H */