|
||||||||||
| 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 | |
protected boolean |
C
|
protected 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 DeltaQueue |
eventQueue
The eventQueue field stores a reference to the event queue
that stores the events posted to the interpreter in chronological order. |
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. |
protected boolean |
H
|
protected 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
|
protected 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. |
protected boolean |
N
|
protected int |
nextPC
The nextPC field is used internally in maintaining the correct
execution order of the instructions. |
protected int |
pc
|
protected long |
postedInterrupts
|
protected byte[] |
regs
|
protected 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
|
protected boolean |
T
|
protected long |
totalCycles
|
protected boolean |
V
|
protected 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 |
delay(long cycles)
|
protected void |
disableInterrupts()
|
protected void |
enableInterrupts()
|
Instr |
getCurrentInstr()
|
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(Register reg)
Read a general purpose register's current value as a byte. |
int |
getRegisterUnsigned(Register reg)
Read a general purpose register's current value as an integer, without any sign extension. |
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 abstract 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 abstract 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)
|
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 abstract 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 abstract 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. |
protected void |
setRegisterByte(Register reg,
byte val)
The setRegisterByte() method writes a value to a general purpose
register. |
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()
|
protected void |
stop()
|
protected void |
unimplemented(Instr i)
|
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 |
| Field Detail |
protected int pc
protected long totalCycles
protected 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
protected boolean I
protected boolean T
protected boolean H
protected boolean S
protected boolean V
protected boolean N
protected boolean Z
protected 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.
protected int nextPC
nextPC field is used internally in maintaining the correct
execution order of the instructions.
protected 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.
protected 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 DeltaQueue eventQueue
eventQueue field stores a reference to the event queue
that stores the events posted to the interpreter in chronological order.
| 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()
protected void stop()
protected abstract void runLoop()
protected abstract 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 abstract 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 abstract void insertBreakPoint(int addr)
protected abstract 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 unimplemented(Instr i)
protected void advanceCycles(long delta)
protected void delay(long cycles)
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 pairpublic 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()
public 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 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 postprotected void enableInterrupts()
protected void disableInterrupts()
protected avrora.sim.BaseInterpreter.ProbedInstr getProbedInstr(int addr)
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||