|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectavrora.sim.BaseInterpreter
The BaseInterpreter class represents a base class of the legacy interpreter and the generated
interpreter(s) that stores the state of the executing program, e.g. registers and flags, etc.
| Nested Class Summary | |
class |
BaseInterpreter.AddressOutOfBoundsException
|
class |
BaseInterpreter.NoSuchInstructionException
|
class |
BaseInterpreter.PCAlignmentException
|
class |
BaseInterpreter.PCOutOfBoundsException
|
| Nested classes inherited from class avrora.sim.State |
State.IOReg, State.RWIOReg |
| Field Summary | |
boolean |
C
|
protected MainClock |
clock
|
int |
cyclesConsumed
The cyclesConsumed field stores the number of cycles consumed in doing a part of the
simulation (e.g. executing an instruction or processing an interrupt). |
protected long |
delayCycles
The delayCycles field tracks the number of cycles that the microcontroller is delayed.
|
protected byte[] |
flash_data
|
protected Instr[] |
flash_instr
|
protected MulticastProbe |
globalProbe
The activeProbe field stores a reference to a MulticastProbe that contains
all of the probes to be fired before and after the main execution runLoop--i.e. before and after every
instruction. |
boolean |
H
|
boolean |
I
|
protected boolean |
innerLoop
The innerLoop field is a boolean that is used internally in the implementation of the
interpreter. |
protected State.IOReg[] |
ioregs
|
boolean |
justReturnedFromInterrupt
The justReturnedFromInterrupt field is used internally in maintaining the invariant stated
in the hardware manual that at least one instruction following a return from an interrupt is executed
before another interrupt can be processed. |
boolean |
N
|
int |
nextPC
The nextPC field is used internally in maintaining the correct execution order of the
instructions. |
protected int |
pc
|
protected long |
postedInterrupts
|
byte[] |
regs
|
boolean |
S
|
protected boolean |
shouldRun
The shouldRun flag is used internally in the main execution runLoop to implement the
correct semantics of start() and stop() to the clients. |
protected Simulator |
simulator
The simulator field stores a reference to the simulator that this interpreter instance
corresponds to. |
protected boolean |
sleeping
The sleeping flag is used internally in the simulator when the microcontroller enters the
sleep mode. |
protected byte[] |
sram
|
protected int |
sram_max
|
protected MulticastWatch[] |
sram_probes
|
protected int |
sram_start
|
protected State.IOReg |
SREG_reg
|
boolean |
T
|
boolean |
V
|
boolean |
Z
|
| Fields inherited from interface avrora.sim.State |
RESERVED |
| Fields inherited from interface avrora.sim.IORegisterConstants |
ACSR, ADCH, ADCL, ADCSRA, ADMUX, ASSR, DDRA, DDRB, DDRC, DDRD, DDRE, DDRF, DDRG, EEARH, EEARL, EECR, EEDR, EICRA, EICRB, EIFR, EIMSK, ETIFR, ETIMSK, ICR1H, ICR1L, ICR3H, ICR3L, MCUCR, MCUCSR, NUM_REGS, OCDR, OCR0, OCR1AH, OCR1AL, OCR1BH, OCR1BL, OCR1CH, OCR1CL, OCR2, OCR3AH, OCR3AL, OCR3BH, OCR3BL, OCR3CH, OCR3CL, OSCCAL, PINA, PINB, PINC, PIND, PINE, PINF, PING, PORTA, PORTB, PORTC, PORTD, PORTE, PORTF, PORTG, RAMPZ, SFIOR, SPCR, SPDR, SPH, SPL, SPMCSR, SPSR, SREG, SREG_C, SREG_H, SREG_I, SREG_N, SREG_S, SREG_T, SREG_V, SREG_Z, TCCR0, TCCR1A, TCCR1B, TCCR1C, TCCR2, TCCR3A, TCCR3B, TCCR3C, TCNT0, TCNT1H, TCNT1L, TCNT2, TCNT3H, TCNT3L, TIFR, TIMSK, TWAR, TWBR, TWCR, TWDR, TWSR, UBRR0H, UBRR0L, UBRR1H, UBRR1L, UCSR0A, UCSR0B, UCSR0C, UCSR1A, UCSR1B, UCSR1C, UDR0, UDR1, WDTCR, XDIV, XMCRA, XMCRB |
| Constructor Summary | |
BaseInterpreter(Simulator simulator,
Program p,
int flash_size,
int ioreg_size,
int sram_size)
|
|
| Method Summary | |
protected void |
advanceCycles(long delta)
|
protected void |
commit()
|
protected void |
delay(long cycles)
|
void |
disableInterrupts()
|
void |
enableInterrupts()
|
Instr |
getCurrentInstr()
The getCurrentInstr() method reads the instruction at the current program counter value
(PC). |
long |
getCycles()
The getCycles() method returns the clock cycle count recorded so far in the simulation. |
byte |
getDataByte(int address)
The getDataByte() method reads a byte value from the data memory (SRAM) at the specified
address. |
boolean |
getFlag_C()
The getFlag_C() method returns the current value of the C bit in the status register as a
boolean. |
boolean |
getFlag_H()
The getFlag_H() method returns the current value of the H bit in the status register as a
boolean. |
boolean |
getFlag_I()
The getFlag_I() method returns the current value of the I bit in the status register as a
boolean. |
boolean |
getFlag_N()
The getFlag_N() method returns the current value of the N bit in the status register as a
boolean. |
boolean |
getFlag_S()
The getFlag_S() method returns the current value of the S bit in the status register as a
boolean. |
boolean |
getFlag_T()
The getFlag_T() method returns the current value of the T bit in the status register as a
boolean. |
boolean |
getFlag_V()
The getFlag_V() method returns the current value of the V bit in the status register as a
boolean. |
boolean |
getFlag_Z()
The getFlag_Z() method returns the current value of the Z bit in the status register as a
boolean. |
Instr |
getInstr(int address)
The getInstr() can be used to retrieve a reference to the Instr object
representing the instruction at the specified program address. |
int |
getInstrSize(int npc)
The getInstrSize() method reads the size of the instruction at the given program address.
|
State.IOReg |
getIOReg(int ioreg)
The getIOReg() method is used to retrieve a reference to the actual IOReg
instance stored internally in the state. |
byte |
getIORegisterByte(int ioreg)
The getIORegisterByte() method reads the value of an IO register. |
int |
getPC()
The getPC() retrieves the current program counter. |
long |
getPostedInterrupts()
The getPostedInterrupts() method returns a mask that represents all interrupts that are
currently pending (meaning they are ready to be fired in priority order as long as the I flag is on). |
protected avrora.sim.BaseInterpreter.ProbedInstr |
getProbedInstr(int addr)
|
byte |
getProgramByte(int address)
The getProgramByte() method reads a byte value from the program (Flash) memory. |
byte |
getRegisterByte(int reg)
|
byte |
getRegisterByte(Register reg)
Read a general purpose register's current value as a byte. |
int |
getRegisterUnsigned(int reg)
|
int |
getRegisterUnsigned(Register reg)
Read a general purpose register's current value as an integer, without any sign extension. |
int |
getRegisterWord(int reg)
|
int |
getRegisterWord(Register reg)
Read a general purpose register pair as an unsigned word. |
int |
getSP()
The getSP() method reads the current value of the stack pointer. |
byte |
getSREG()
The getSREG() method reads the value of the status register. |
byte |
getStackByte()
The getStackByte() method reads a byte from the address specified by SP+1. |
protected void |
initializeIORegs()
|
protected void |
insertBreakPoint(int addr)
|
void |
insertProbe(Simulator.Probe p)
The insertProbe() method allows a probe to be inserted that is executed before and after
every instruction that is executed by the simulator |
protected void |
insertProbe(Simulator.Probe p,
int addr)
|
protected void |
insertWatch(Simulator.Watch p,
int data_addr)
|
boolean |
isSleeping()
The isSleeping() method returns whether the simulator is currently in a sleep mode. |
protected void |
makeImpression(Program p)
|
protected avrora.sim.BaseInterpreter.ProbedInstr |
makeProbedInstr(int addr)
|
byte |
popByte()
The popByte() method pops a byte from the stack by reading from the address pointed to by
SP+1 and incrementing the stack pointer. |
void |
postInterrupt(int num)
The postInterrupt() method is generally only used within the simulator which does
pre-processing of interrupts before it posts them into the internal State instance. |
void |
pushByte(byte val)
The pushByte() method pushes a byte onto the stack by writing to the memory address
pointed to by the stack pointer and decrementing the stack pointer. |
protected void |
removeBreakPoint(int addr)
|
void |
removeProbe(Simulator.Probe b)
The removeProbe() method removes a probe from the global probe table (the probes executed
before and after every instruction). |
protected void |
removeProbe(Simulator.Probe p,
int addr)
|
protected void |
removeWatch(Simulator.Watch p,
int data_addr)
|
protected abstract void |
runLoop()
|
void |
setDataByte(int address,
byte val)
The setDataByte() method writes a value to the data memory (SRAM) of the state. |
protected void |
setInstr(Instr i,
int address)
|
void |
setIOReg(int ioreg,
State.IOReg reg)
The setIOReg method installs the specified IOReg object to the specified IO
register number. |
void |
setIORegisterByte(int ioreg,
byte val)
The setIORegisterByte() method writes a value to the specified IO register. |
void |
setPostedInterrupts(long posted)
|
void |
setRegisterByte(int reg,
byte val)
|
protected void |
setRegisterByte(Register reg,
byte val)
The setRegisterByte() method writes a value to a general purpose register. |
void |
setRegisterWord(int reg,
int val)
|
protected void |
setRegisterWord(Register reg,
int val)
The setRegisterWord method writes a word value to a general purpose register pair. |
protected void |
setSP(int val)
The setSP() method updates the value of the stack pointer. |
protected void |
setSREG(byte val)
The setSREG() method writes the value of the status register. |
protected void |
start()
|
void |
stop()
|
void |
unpostInterrupt(int num)
The unpostInterrupt() method is generally only used within the simulator which does
pre-processing of interrupts before it posts them into the internal State instance. |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Methods inherited from interface avrora.core.InstrVisitor |
visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit |
| Field Detail |
protected int pc
public final byte[] regs
protected final State.IOReg[] ioregs
protected byte[] sram
protected MulticastWatch[] sram_probes
protected Instr[] flash_instr
protected byte[] flash_data
protected long postedInterrupts
protected final int sram_start
protected final int sram_max
public boolean I
public boolean T
public boolean H
public boolean S
public boolean V
public boolean N
public boolean Z
public boolean C
protected State.IOReg SREG_reg
protected final MulticastProbe globalProbe
activeProbe field stores a reference to a MulticastProbe that contains
all of the probes to be fired before and after the main execution runLoop--i.e. before and after every
instruction.
protected boolean innerLoop
innerLoop field is a boolean that is used internally in the implementation of the
interpreter. When something in the simulation changes (e.g. an interrupt is posted), this field is set
to false, and the execution loop (e.g. an interpretation or sleep loop) is broken out of.
public int nextPC
nextPC field is used internally in maintaining the correct execution order of the
instructions.
public int cyclesConsumed
cyclesConsumed field stores the number of cycles consumed in doing a part of the
simulation (e.g. executing an instruction or processing an interrupt).
protected long delayCycles
delayCycles field tracks the number of cycles that the microcontroller is delayed.
Delay is needed because some devices pause execution of the program for some number of cycles, and also
to implement random delay at the beginning of startup in multiple node scenarios to prevent artificial
cycle-level synchronization.
protected boolean shouldRun
shouldRun flag is used internally in the main execution runLoop to implement the
correct semantics of start() and stop() to the clients.
protected boolean sleeping
sleeping flag is used internally in the simulator when the microcontroller enters the
sleep mode.
public boolean justReturnedFromInterrupt
justReturnedFromInterrupt field is used internally in maintaining the invariant stated
in the hardware manual that at least one instruction following a return from an interrupt is executed
before another interrupt can be processed.
protected final Simulator simulator
simulator field stores a reference to the simulator that this interpreter instance
corresponds to. There should be a one-to-one mapping between instances of the Simulator
class and instances of the BaseInterpreter class.
protected final MainClock clock
| Constructor Detail |
public BaseInterpreter(Simulator simulator,
Program p,
int flash_size,
int ioreg_size,
int sram_size)
| Method Detail |
protected void makeImpression(Program p)
protected void start()
public void stop()
protected abstract void runLoop()
protected void insertProbe(Simulator.Probe p,
int addr)
public void insertProbe(Simulator.Probe p)
insertProbe() method allows a probe to be inserted that is executed before and after
every instruction that is executed by the simulator
p - the probe to insert
protected void removeProbe(Simulator.Probe p,
int addr)
public void removeProbe(Simulator.Probe b)
removeProbe() method removes a probe from the global probe table (the probes executed
before and after every instruction). The comparison used is reference equality, not
.equals().
b - the probe to removeprotected void insertBreakPoint(int addr)
protected void removeBreakPoint(int addr)
protected void insertWatch(Simulator.Watch p,
int data_addr)
protected void removeWatch(Simulator.Watch p,
int data_addr)
protected void initializeIORegs()
protected void advanceCycles(long delta)
protected void delay(long cycles)
public byte getRegisterByte(int reg)
public int getRegisterUnsigned(int reg)
public int getRegisterWord(int reg)
public byte getRegisterByte(Register reg)
getRegisterByte in interface Statereg - the register to read
public int getRegisterUnsigned(Register reg)
getRegisterUnsigned in interface Statereg - the register to read
public int getRegisterWord(Register reg)
getRegisterWord in interface Statereg - the low register of the pair to read
protected void setRegisterByte(Register reg,
byte val)
setRegisterByte() method writes a value to a general purpose register. This is a
destructive update and should only be called from the appropriate places in the simulator.
reg - the register to write the value toval - the value to write to the register
protected void setRegisterWord(Register reg,
int val)
setRegisterWord method writes a word value to a general purpose register pair. This is
a destructive update and should only be called from the appropriate places in the simulator. The
specified register and the next register in numerical order are updated with the low-order and
high-order byte of the value passed, respectively. The specified register should be less than r31,
since r32 (the next register) does not exist.
reg - the low register of the pair to writeval - the word value to write to the register pair
public void setRegisterByte(int reg,
byte val)
public void setRegisterWord(int reg,
int val)
public byte getSREG()
getSREG() method reads the value of the status register. The status register contains
the I, T, H, S, V, N, Z, and C flags, in order from highest-order to lowest-order.
getSREG in interface Stateprotected void setSREG(byte val)
setSREG() method writes the value of the status register. This method should only be
called from the appropriate places in the simulator.
val - public byte getDataByte(int address)
getDataByte() method reads a byte value from the data memory (SRAM) at the specified
address.
getDataByte in interface Stateaddress - the byte address to read
java.lang.ArrayIndexOutOfBoundsException - if the specified address is not the valid memory rangepublic byte getProgramByte(int address)
getProgramByte() method reads a byte value from the program (Flash) memory. The flash
memory generally stores read-only values and the instructions of the program. Care should be taken that
the program memory at the specified address does not contain an instruction. This is because, in
general, programs should not read instructions as data, and secondly, because no assembler is present
in Avrora and therefore the actual byte value of an instruction may not be known.
getProgramByte in interface Stateaddress - the byte address at which to read
java.lang.ArrayIndexOutOfBoundsException - if the specified address is not the valid program memory range
public void setDataByte(int address,
byte val)
setDataByte() method writes a value to the data memory (SRAM) of the state. This is
generally meant for the simulator, related classes, and device implementations to use, but could also
be used by debuggers and other tools.
address - the byte address at which to write the valueval - the value to writepublic Instr getCurrentInstr()
getCurrentInstr() method reads the instruction at the current program counter value
(PC).
Instr representing the instruction at the current program
counter valuepublic int getInstrSize(int npc)
getInstrSize() method reads the size of the instruction at the given program address.
This is needed in the interpreter to compute the target of a skip instruction (an instruction that
skips over the instruction following it).
npc - the program address of the instruction
public byte getIORegisterByte(int ioreg)
getIORegisterByte() method reads the value of an IO register. Invocation of this
method causes an invocatiobn of the .read() method on the corresponding internal
IOReg object, and its value returned.
getIORegisterByte in interface Stateioreg - the IO register number
public void setIOReg(int ioreg,
State.IOReg reg)
setIOReg method installs the specified IOReg object to the specified IO
register number. This method is generally only used in the simulator and in device implementations to
set up the state correctly during initialization.
ioreg - the IO register numberreg - the IOReg object to installpublic State.IOReg getIOReg(int ioreg)
getIOReg() method is used to retrieve a reference to the actual IOReg
instance stored internally in the state. This is generally only used in the simulator and device
implementations, and clients should probably not call this memory directly.
getIOReg in interface Stateioreg - the IO register number to retrieve
IOReg instance of the specified IO register
public void setIORegisterByte(int ioreg,
byte val)
setIORegisterByte() method writes a value to the specified IO register. This is
generally only used internally to the simulator and device implementations, and client interfaces
should probably not call this method.
ioreg - the IO register number to which to write the valueval - the value to write to the IO registerpublic byte popByte()
popByte() method pops a byte from the stack by reading from the address pointed to by
SP+1 and incrementing the stack pointer. This method, like all of the other methods that change the
state, should probably only be used within the simulator. This method should not be called with an
empty stack, as it will cause an exception consistent with trying to read non-existent memory.
public void pushByte(byte val)
pushByte() method pushes a byte onto the stack by writing to the memory address
pointed to by the stack pointer and decrementing the stack pointer. This method, like all of the other
methods that change the state, should probably only be used within the simulator.
val - the value to push onto the stackprotected void setSP(int val)
setSP() method updates the value of the stack pointer. Generally the stack pointer is
stored in two IO registers SPL and SPH. This method should generally only be
used within the simulator.
val - IORegisterConstantspublic long getCycles()
getCycles() method returns the clock cycle count recorded so far in the simulation.
getCycles in interface Statepublic long getPostedInterrupts()
getPostedInterrupts() method returns a mask that represents all interrupts that are
currently pending (meaning they are ready to be fired in priority order as long as the I flag is on).
getPostedInterrupts in interface Statepublic int getPC()
getPC() retrieves the current program counter.
getPC in interface Statepublic boolean getFlag_I()
getFlag_I() method returns the current value of the I bit in the status register as a
boolean.
getFlag_I in interface Statepublic boolean getFlag_T()
getFlag_T() method returns the current value of the T bit in the status register as a
boolean.
getFlag_T in interface Statepublic boolean getFlag_H()
getFlag_H() method returns the current value of the H bit in the status register as a
boolean.
getFlag_H in interface Statepublic boolean getFlag_S()
getFlag_S() method returns the current value of the S bit in the status register as a
boolean.
getFlag_S in interface Statepublic boolean getFlag_V()
getFlag_V() method returns the current value of the V bit in the status register as a
boolean.
getFlag_V in interface Statepublic boolean getFlag_N()
getFlag_N() method returns the current value of the N bit in the status register as a
boolean.
getFlag_N in interface Statepublic boolean getFlag_Z()
getFlag_Z() method returns the current value of the Z bit in the status register as a
boolean.
getFlag_Z in interface Statepublic boolean getFlag_C()
getFlag_C() method returns the current value of the C bit in the status register as a
boolean.
getFlag_C in interface Statepublic Instr getInstr(int address)
getInstr() can be used to retrieve a reference to the Instr object
representing the instruction at the specified program address. Care should be taken that the address in
program memory specified does not contain data. This is because Avrora does have a functioning
disassembler and assumes that the Instr objects for each instruction in the program are
known a priori.
getInstr in interface Stateaddress - the byte address from which to read the instruction
Instr object representing the instruction at that address in
the program
protected void setInstr(Instr i,
int address)
public byte getStackByte()
getStackByte() method reads a byte from the address specified by SP+1. This method
should not be called with an empty stack, as it will cause an exception consistent with trying to read
non-existent memory.
getStackByte in interface Statepublic int getSP()
getSP() method reads the current value of the stack pointer. Since the stack pointer
is stored in two IO registers, this method will cause the invocation of the .read() method
on each of the IOReg objects that store these values.
getSP in interface Statepublic boolean isSleeping()
isSleeping() method returns whether the simulator is currently in a sleep mode.
isSleeping in interface Statepublic void unpostInterrupt(int num)
unpostInterrupt() method is generally only used within the simulator which does
pre-processing of interrupts before it posts them into the internal State instance. This
method causes the specified interrupt number to be removed from the pending list of interrupts Clients
should not use this method directly.
num - the interrupt number to postpublic void setPostedInterrupts(long posted)
public void postInterrupt(int num)
postInterrupt() method is generally only used within the simulator which does
pre-processing of interrupts before it posts them into the internal State instance. This
method causes the specified interrupt number to be added to the pending list of interrupts Clients
should not use this method directly.
num - the interrupt number to postpublic void enableInterrupts()
public void disableInterrupts()
protected avrora.sim.BaseInterpreter.ProbedInstr getProbedInstr(int addr)
protected avrora.sim.BaseInterpreter.ProbedInstr makeProbedInstr(int addr)
protected void commit()
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||