Download - Automatic Code Generation for CSP# Models in PAT

Transcript
Page 1: Automatic Code Generation for CSP# Models in PAT

Automatic Code Generation for CSP# Models in PAT

LIN Shang-Wei

Temasek LaboratoriesNational University of Singapore

Page 2: Automatic Code Generation for CSP# Models in PAT

Outline

• Code Generation Approach• Example• Demo• Future Work

Page 3: Automatic Code Generation for CSP# Models in PAT

Code Generation Approach

Quantum Platform (QP)

Linux/BSD Windows/WinCE μC/OS-II …

80x86 ARM-Cortex/ARM9/ARM7 …

Application(Active Objects)

Generated code is OS-independent and hardware-independent!

CSP# state machines QP active objects

Both shared memory and message passing are supported

Page 4: Automatic Code Generation for CSP# Models in PAT

4

Interleave Process

P = Q1 ||| Q2 ||| … ||| Qn

SM1 SM2 SMn…

SM: State Machine

Page 5: Automatic Code Generation for CSP# Models in PAT

5

Guarded Process

P = [b] Q

P

Q

TIMEOUT [!b] /

TIMEOUT [b] /

Page 6: Automatic Code Generation for CSP# Models in PAT

6

General Choice

P = Q1 [] Q2 [] … [] Qn

P

Q1 Q2 Qn…

TIMEOUT [op == 1] /

TIMEOUT [op == 2] /

TIMEOUT [op == n] /

op = rand(1,n)

Page 7: Automatic Code Generation for CSP# Models in PAT

7

Conditional Choice Process

P = if b {Q1} else {Q2}

P

Q1 Q2

TIMEOUT [b] / TIMEOUT [!b] /

Page 8: Automatic Code Generation for CSP# Models in PAT

8

Case ProcessP = case {

b1: Q1

b2: Q2

…bn: Qn

}

P

Q1 Q2 Qn…

TIMEOUT [b1] /

TIMEOUT [!b1 && b2] /

TIMEOUT [!b1 && !b2 … && bn] /

Page 9: Automatic Code Generation for CSP# Models in PAT

9

Sequence Process

P = Q1 ; Q2

P

Q1

TIMEOUT/

Q2

TIMEOUT/

Page 10: Automatic Code Generation for CSP# Models in PAT

10

Event Prefixing Process

P = e Q

P

Q

TIMEOUT / e();

Page 11: Automatic Code Generation for CSP# Models in PAT

11

Data Operation Process

P = e { prog } Q

P

Q

TIMEOUT / e();prog();

Page 12: Automatic Code Generation for CSP# Models in PAT

12

Channel Input Process

P = ch?x Q

P

Q

ch_sig /

Page 13: Automatic Code Generation for CSP# Models in PAT

13

Channel Output Process

P = ch!x Q

P

Q

TIMEOUT / PUBLISH(ch_sig)

Page 14: Automatic Code Generation for CSP# Models in PAT

Outline

• Code Generation Approach• Example• Demo• Future Work

Page 15: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol

#define N 2;var turn;var pos[N];

P0() = req.0{pos[0] = 1; turn=1} -> Wait0(); cs.0 -> reset.0{pos[0] = 0} -> P0();

Wait0() = if (pos[1]==1 && turn == 1) { Wait0() };

P1() = req.1{pos[1] = 1; turn=0} -> Wait1(); cs.1 -> reset.1{pos[1] = 0} -> P1();

Wait1() = if (pos[0]==1 && turn == 0) { Wait1() };

Peterson() = P0() ||| P1();

Page 16: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol (cont.)

0

1 2 3

TIMEOUT /req_0() ; pos[0] = 1 ; turn = 1;

TIMEOUT [pos[1] = 1 && turn == 1] /

TIMEOUT [pos[1] = 0 || turn == 0] /

TIMEOUT / cs_0();

TIMEOUT /reset_0() ; pos[0] = 0;

Generated state machine for the P0() process

Page 17: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol (cont.)class P0 : public QActive { /** P0.h **/ public: P0(); ~P0();

private: static QState initial(P0 *me, QEvent const *e); static QState P0_0(P0 *me, QEvent const *e); static QState P0_1(P0 *me, QEvent const *e); static QState P0_2(P0 *me, QEvent const *e); static QState P0_3(P0 *me, QEvent const *e);

public: void req_0(); void cs_0(); void reset_0();

private: QTimeEvt m_timeEvt;};

Page 18: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol (cont.)P0::P0() : /** P0.cpp **/QActive((QStateHandler)&P0::initial),m_timeEvt(TIMEOUT_SIG){}

P0::~P0(){}

QState P0::initial(P0 *me, QEvent const *){ return Q_TRAN(&P0::P0_0);}

void P0::req_0(){ std::cout<<"req_0"<<std::endl;}

void P0::cs_0(){ std::cout<<"cs_0"<<std::endl;}

void P0::reset_0(){ std::cout<<"reset_0"<<std::endl;}

Page 19: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol (cont.)QState P0:: /** P0.cpp (cont.)**/P0_0(P0 *me, QEvent const *e){ QEvent *pe;

switch(e->sig){ case Q_ENTRY_SIG: me->m_timeEvt.postIn(me, WAIT_TIME); return Q_HANDLED();

case Q_EXIT_SIG: return Q_HANDLED();

case TIMEOUT_SIG: me->req_0(); pos[0]=1;turn=1; return Q_TRAN(&P0::P0_1); }

return Q_SUPER(&QHsm::top);}

Page 20: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol (cont.)QState P0:: /** P0.cpp (cont.)**/P0_1(P0 *me, QEvent const *e){ QEvent *pe;

switch(e->sig){ case Q_ENTRY_SIG: me->m_timeEvt.postIn(me, WAIT_TIME); return Q_HANDLED();

case Q_EXIT_SIG: return Q_HANDLED();

case TIMEOUT_SIG: if(((pos[1] == 1) && (turn == 1))){ return Q_TRAN(&P0::P0_1); } if(!(((pos[1] == 1) && (turn == 1)))){ return Q_TRAN(&P0::P0_2); } } return Q_SUPER(&QHsm::top);}

Page 21: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol (cont.)

QState P0::P0_2(P0 *me, QEvent const *e){ QEvent *pe;

switch(e->sig){ case Q_ENTRY_SIG: me->m_timeEvt.postIn(me, WAIT_TIME); return Q_HANDLED();

case Q_EXIT_SIG: return Q_HANDLED();

case TIMEOUT_SIG: me->cs_0(); return Q_TRAN(&P0::P0_3); } return Q_SUPER(&QHsm::top);}

Page 22: Automatic Code Generation for CSP# Models in PAT

Peterson’s Protocol (cont.)QState P0::P0_3(P0 *me, QEvent const *e){ QEvent *pe;

switch(e->sig){ case Q_ENTRY_SIG: me->m_timeEvt.postIn(me, WAIT_TIME); return Q_HANDLED(); case Q_EXIT_SIG: return Q_HANDLED();

case TIMEOUT_SIG: me->reset_0(); pos[0]=0; return Q_TRAN(&P0::P0_0); } return Q_SUPER(&QHsm::top);}

Page 23: Automatic Code Generation for CSP# Models in PAT

23

Peterson’s Protocol (cont.)// Main.cpp

static P0 __P0;static P1 __P1;

static QEvent const *l_P0_QueueSto[10]; static QEvent const *l_P1_QueueSto[10];

static QSubscrList l_subscrSto[MAX_PUB_SIG];

static union SmallEvents { void *e0; uint8_t e1[sizeof(DataEvent)]; // other event types to go into this pool} l_smlPoolSto[2 * (1 + 0) * 2]; // storage for the small event pool

Page 24: Automatic Code Generation for CSP# Models in PAT

24

Peterson’s Protocol (cont.)int main(int argc, char *argv[]) {

QF::init(); QF::psInit(l_subscrSto, Q_DIM(l_subscrSto)); QF::poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0]));

__P0.start((uint8_t)(1), l_tableQueueSto, Q_DIM(l_tableQueueSto),

(void *)0, 0, (QEvent *)0);

__P1.start((uint8_t)(2), l_tableQueueSto, Q_DIM(l_tableQueueSto),

(void *)0, 0, (QEvent *)0);

QF::run(); return 0;}

Page 25: Automatic Code Generation for CSP# Models in PAT

Outline

• Code Generation Approach• Example• Demo• Future Work

Page 26: Automatic Code Generation for CSP# Models in PAT

Outline

• Code Generation Approach• Example• Demo• Future Work

Page 27: Automatic Code Generation for CSP# Models in PAT

Future Work• Deployment on different platforms

– Providing generic hardware APIs– For verification

• Abstract hardware models with equivalent semantics– For code generation

• Linking generic hardware APIs and their implementation

• Non-functional behavior modeling and verification– Power consumption

• Profiling to get the estimation• Additional global variables to capture the cost

– Time constraints• RTS or Timed automata

• Multi-core Platforms