pysimavr

About

pysimavr is a python wrapper for simavr which is AVR and arduino simulator

Links:

Travis Coveralls Latest Version Supported Python versions License Downloads Code Health Documentation

Features:
  • python wrapper using swig
  • simavr source code and avr-libc headers are included for easier installation
  • object oriented interface on top of the generated interface
  • maximum speed can be real-time
  • serial communication
  • check simavr documentation

Basic usage

>>> from pysimavr.avr import Avr
>>> avr=Avr(mcu='atmega48',f_cpu=8000000)
>>> firmware = Firmware('lcd.elf')
>>> avr.load_firmware(firmware)
>>> from pysimavr.sim import ArduinoSim
>>> print ArduinoSim(snippet='Serial.print("hello!");').get_serial()
hello!

Installation

check simavr documentation

General

  • install python

  • install pip

  • install swig (for source build only)

  • install header files and a static library for Python (for source build only)

  • install a compiler (for source build only)

  • install elf library

  • install the program:

    # as root
    pip install pysimavr
    

Ubuntu 14.04

sudo apt-get install python-pip
sudo apt-get install python-dev gcc libelf-dev arduino
sudo pip install pysimavr
# optional for some tests:
sudo apt-get install freeglut3-dev scons swig

Uninstall

# as root
pip uninstall pysimavr

Usage

pysimavr.examples.simple:

#-- include('examples/simple.py')--#
from pysimavr.avr import Avr

if __name__ == "__main__":
    avr = Avr(mcu='atmega48', f_cpu=8000000)
    print( avr.pc )
    avr.step(1)
    print( avr.pc )
    avr.step(1)
    print( avr.pc )

    avr.terminate()
#-#

Output:

#-- sh('python -m pysimavr.examples.simple ')--#
0
2
4
#-#

pysimavr.examples.hello:

#-- include('examples/hello.py')--#
from pysimavr.sim import ArduinoSim

if __name__ == "__main__":
    s= ArduinoSim(snippet='Serial.println("hello!");').get_serial()
    print(s)
#-#

Output:

#-- sh('python -m pysimavr.examples.hello ')--#
hello!

#-#

pysimavr.examples.delay:

#-- include('examples/delay.py')--#
from pysimavr.sim import ArduinoSim
import time

snippet = '''
int i=0;
while (1)
{
    Serial.println(i++);
    _delay_ms(1000);
}
'''
t0 = None


def logger(x):
    global t0
    t = time.time()
    if not t0:
        t0 = t
    print t - t0, x


f_cpu=16000000
fps=20
speed=1
timespan=5

if __name__ == "__main__":
    ArduinoSim(snippet=snippet,
           timespan=timespan,
           serial_line_logger=logger,
           f_cpu=f_cpu,
           fps=fps,
           speed=speed,
           ).run()
#-#

Output:

#-- sh('python -m pysimavr.examples.delay ')--#
0.0 0

1.00977802277 1

2.01976013184 2

3.02968215942 3

4.03792500496 4

#-#

vcd export example

pysimavr.examples.vcd:

#-- include('examples/vcd.py')--#
from pysimavr.sim import ArduinoSim


vcdfile='delay.vcd'
snippet = '''
    Serial.println("start");
    pinMode(0, OUTPUT);
    digitalWrite(0, HIGH);
    delay(100);
    digitalWrite(0, LOW);
    delay(100);
    digitalWrite(0, HIGH);
    delay(100);
    digitalWrite(0, LOW);
    delay(100);
    Serial.println("end");
'''

if __name__ == "__main__":
    sim = ArduinoSim(snippet=snippet, vcd=vcdfile, timespan=0.5)
    sim.run()
#-#
_images/gtkwave_id0.png

File hierarchy

|-docs                   sphinx documentation
|---.build               generated documentation
|-pysimavr               main python package, high level classes
|---examples             examples
|---swig                 all swig files (simavr and parts)
|-----include            copy of simavr generated *.h files
|-------avr              copy from avr-libc
|-----parts              some electronic parts in c
|-----simavr             simavr as git submodule
|-tests                  unit tests

How to update external sources

  1. copy avr-libc headers (Ubuntu folder: /usr/lib/avr/include/avr/) into pysimavr/swig/include/avr
  2. simavr is a git submodule. Run ‘make’ inside simavr directory, then copy generated sim_core_config.h and sim_core_decl.h into pysimavr/swig/include

API

There are 2 interfaces:
  • pysimavr.swig.*: low level, generated by swig
  • pysimavr.*: high level classes, they can redirect function calls to low level interface. Example: Avr class (high level) has all properties and methods of avr_t class (low level) automatically.

low level interface

class pysimavr.swig.ac_input.ac_input_t
avr
irq
value
class pysimavr.swig.hd44780.hd44780_t
avr
cursor
datapins
flags
h
irq
pinstate
readpins
vram
w
class pysimavr.swig.inverter.inverter_t
avr
irq
out
class pysimavr.swig.ledrow.ledrow_t
avr
irq
pinstate
pinstate_changed
class pysimavr.swig.sgm7.sgm7_t
avr
digit_count
digit_pin
digit_port
digit_segments
digit_segments_changed
irq
pinstate
segment_pin
segment_port
class pysimavr.swig.simavr.avr_io_t
avr
dealloc
ioctl
irq
irq_count
irq_ioctl_get
irq_names
kind
next
reset
class pysimavr.swig.simavr.avr_iopin_t
pin
port
class pysimavr.swig.simavr.avr_ioport_external_t
mask
name
value
class pysimavr.swig.simavr.avr_ioport_getirq_t
bit
irq
class pysimavr.swig.simavr.avr_ioport_state_t
ddr
name
pin
port
class pysimavr.swig.simavr.avr_ioport_t
external
io
name
pcint
r_ddr
r_pcint
r_pin
r_port
class pysimavr.swig.simavr.avr_ioport_t_external
pull_mask
pull_value
class pysimavr.swig.simavr.avr_irq_pool_t
count
irq
class pysimavr.swig.simavr.avr_irq_t
flags
hook
irq
name
pool
value
class pysimavr.swig.simavr.avr_kind_t
make
names
class pysimavr.swig.simavr.avr_regbit_t
bit
mask
reg
class pysimavr.swig.simavr.avr_symbol_t
addr
symbol
class pysimavr.swig.simavr.avr_t
address_size
aref
avcc
codeend
custom
cycle
cycle_timers
data
e2end
eind
flash
flashend
frequency
fuse
gdb
gdb_port
init
interrupt_state
interrupts
io
io_port
io_shared_io
io_shared_io_count
irq_pool
log
mmcu
pc
ramend
rampz
reset
reset_pc
run
run_cycle_count
run_cycle_limit
signature
sleep
sleep_usec
sreg
state
trace
trace_data
vcc
vcd
vector_size
class pysimavr.swig.simavr.avr_t_custom
data
deinit
init
class pysimavr.swig.simavr.avr_t_io
irq
r
w
class pysimavr.swig.simavr.avr_t_io_r
c
param
class pysimavr.swig.simavr.avr_t_io_shared_io
io
used
class pysimavr.swig.simavr.avr_t_io_shared_io_io
c
param
class pysimavr.swig.simavr.avr_t_io_w
c
param
class pysimavr.swig.simavr.avr_trace_data_t
codeline
old
old_pci
touched
class pysimavr.swig.simavr.avr_trace_data_t_old
pc
sp
class pysimavr.swig.simavr.avr_vcd_log_t
signal
value
when
class pysimavr.swig.simavr.avr_vcd_signal_t
alias
irq
name
size
class pysimavr.swig.simavr.avr_vcd_t
avr
filename
log
logindex
logsize
output
period
signal
signal_count
start
class pysimavr.swig.simavr.elf_firmware_t
aref
avcc
bsssize
command_register_addr
console_register_addr
datasize
eeprom
eesize
external_state
flash
flashbase
flashsize
frequency
mmcu
symbol
symbolcount
trace
tracecount
tracename
traceperiod
vcc
class pysimavr.swig.simavr.elf_firmware_t_external_state
mask
port
value
class pysimavr.swig.simavr.elf_firmware_t_trace
addr
mask
name

high level interface

class pysimavr.ac.Ac(avr)
getirq(pin)
pysimavr.connect.connect_irqs(irq_out, irq_in, bidirectional=False)
pysimavr.connect.connect_pins_by_rule(rule, device_map, vcd=None)

rule example:

B0 –> D4 -> vcd

B1 <== D5 B2 => D6 # B3 <=> D7

class pysimavr.firmware.Firmware(filename=None)
mcu
read(filename)
class pysimavr.inverter.Inverter(avr)
getirq(pin)
out(i)
class pysimavr.lcd.Lcd(avr, size=(20, 2))
get_char(x, y)
getirq(pin)
pinstate(pin)
reset()
class pysimavr.ledrow.LedRow(avr, size=8)
getirq(pin)
pinstate(i)
reset_dirty(i)

read and reset

class pysimavr.sgm7.Sgm7(avr, size=4)
digit_segments(digit_index)
getirq(pin)
pinindex(pin_name)
pinstate(pin)
reset_dirty(digit_index)

read and reset

class pysimavr.vcdfile.VcdFile(avr, filename='gtkwave_output.vcd', period=10)
add_signal(irq, name=None, bits=1)
start()
stop()
terminate()