summaryrefslogtreecommitdiff
path: root/tb/models/smp.py
blob: deb463c886206a7e3b05ca1c5b3666125a07bce9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
__all__ = ['SmpModel']

class SmpModel:
    def __init__(self):
        self._pes = [
            SmpPe(0),
            SmpPe(1),
            SmpPe(1),
            SmpPe(1)]

    def read(self):
        return self._pes[0].read() \
                | self._pes[1].read() << 8 \
                | self._pes[2].read() << 16 \
                | self._pes[3].read() << 24

    def halt(self, cpu):
        self._pes[cpu].halt()

    def run(self, cpu):
        self._pes[cpu].run()

class SmpPe:
    def __init__(self, halt_on_reset):
        self._bkpt = 0
        self._halted = halt_on_reset

    def read(self):
        # bit 2 es alive
        return 1 << 2 \
            | self._bkpt << 1 \
            | self._halted

    def halt(self):
        self._halted = 1

    def run(self):
        self._halted = 0