A Deterministic Concurrent Language for Embedded Systems

Similar documents
A Deterministic Concurrent Language for Embedded Systems

A Deterministic Concurrent Language for Embedded Systems

Efficient, Deterministic, and Deadlock-free Concurrency

Arrays in SHIM: A Proposal

Dealing with Concurrency Problems

Deterministic Concurrency

ESUIF: An Open Esterel Compiler

Concurrency and Communication: Lessons from the SHIM Project

Dataflow Languages. Languages for Embedded Systems. Prof. Stephen A. Edwards. March Columbia University

SHIM: A Language for Hardware/Software Integration

Haskell to Hardware and Other Dreams

CS3733: Operating Systems

Concurrency COMS W4115. Prof. Stephen A. Edwards Spring 2002 Columbia University Department of Computer Science

Ordering Within Expressions. Control Flow. Side-effects. Side-effects. Order of Evaluation. Misbehaving Floating-Point Numbers.

Implementing Coroutines. Faking Coroutines in Java

Control Flow COMS W4115. Prof. Stephen A. Edwards Fall 2006 Columbia University Department of Computer Science

Compiling Parallel Algorithms to Memory Systems

Language Design COMS W4115. Prof. Stephen A. Edwards Spring 2003 Columbia University Department of Computer Science

Stanford University Computer Science Department CS 295 midterm. May 14, (45 points) (30 points) total

CS 4240: Compilers and Interpreters Project Phase 1: Scanner and Parser Due Date: October 4 th 2015 (11:59 pm) (via T-square)

Informatica 3. Marcello Restelli. Laurea in Ingegneria Informatica Politecnico di Milano 9/15/07 10/29/07

Chapter 5 Concurrency: Mutual Exclusion. and. Synchronization. Operating Systems: Internals. and. Design Principles

CS4411 Intro. to Operating Systems Exam 1 Fall points 10 pages

Chapter 7 Control I Expressions and Statements

Chapter 5 Concurrency: Mutual Exclusion and Synchronization

Using and Compiling Esterel

Compilers. Type checking. Yannis Smaragdakis, U. Athens (original slides by Sam

CSCE 314 Programming Languages. Type System

Embedded Systems 8. Identifying, modeling and documenting how data moves around an information system. Dataflow modeling examines

Ch 9: Control flow. Sequencers. Jumps. Jumps

CMSC 330: Organization of Programming Languages

Advanced MEIC. (Lesson #18)

Last Time. Introduction to Design Languages. Syntax, Semantics, and Model. This Time. Syntax. Computational Model. Introduction to the class

SHIM: A Deterministic Approach to Programming with Threads

EE382N.23: Embedded System Design and Modeling

CS533 Concepts of Operating Systems. Jonathan Walpole

Control Flow. Stephen A. Edwards. Fall Columbia University

Motivation was to facilitate development of systems software, especially OS development.

CSE 307: Principles of Programming Languages

Language Design COMS W4115. Prof. Stephen A. Edwards Fall 2006 Columbia University Department of Computer Science

Concurrency Abstractions in C#

Copyright 2008 CS655 System Modeling and Analysis. Korea Advanced Institute of Science and Technology

Programming Languages Third Edition. Chapter 9 Control I Expressions and Statements

CSE Traditional Operating Systems deal with typical system software designed to be:

Functioning Hardware from Functional Specifications

Dept. of CSE, York Univ. 1

CS 5460/6460 Operating Systems

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Steve Gribble. Synchronization. Threads cooperate in multithreaded programs

Types. Type checking. Why Do We Need Type Systems? Types and Operations. What is a type? Consensus

Lecture 3 SPIN and Promela

Lexical Considerations

Chapter 6: Process Synchronization

Order Is A Lie. Are you sure you know how your code runs?

Static Program Analysis Part 1 the TIP language

Programming Languages

Concept of a process

Imperative Programming Languages (IPL)

Condition Variables CS 241. Prof. Brighten Godfrey. March 16, University of Illinois

COS 320. Compiling Techniques

LECTURE 18. Control Flow

A Transactional Model and Platform for Designing and Implementing Reactive Systems

Structuring the Computation. Structuring the Computation

Software Engineering using Formal Methods

Intermediate Code Generation

Appendix. Grammar. A.1 Introduction. A.2 Keywords. There is no worse danger for a teacher than to teach words instead of things.

Concurrent Models of Computation

Under the Compiler's Hood: Supercharge Your PLAYSTATION 3 (PS3 ) Code. Understanding your compiler is the key to success in the gaming world.

The S-Expression Design Language (SEDL) James C. Corbett. September 1, Introduction. 2 Origins of SEDL 2. 3 The Language SEDL 2.

Modular code generation from synchronous models:

Semantic Analysis and Type Checking

Introduction 2 The first synchronous language (early 80 s) Gérard Berry and his team (École des Mines de Paris / INRIA Sophia-Antipolis) Imperative, s

Computer Science /21/2000

Relation Overriding. Syntax and Semantics. Simple Semantic Domains. Operational Semantics

Introduction to Model Checking

int foo() { x += 5; return x; } int a = foo() + x + foo(); Side-effects GCC sets a=25. int x = 0; int foo() { x += 5; return x; }

The Esterel Language. The Esterel Version. Basic Ideas of Esterel

Tom Ball Sebastian Burckhardt Madan Musuvathi Microsoft Research

The Esterel language

ECL: A SPECIFICATION ENVIRONMENT FOR SYSTEM-LEVEL DESIGN

Advanced Threads & Monitor-Style Programming 1/24

C#: framework overview and in-the-small features

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Hank Levy 412 Sieg Hall

Agenda. The main body and cout. Fundamental data types. Declarations and definitions. Control structures

1 Lexical Considerations

Modern Programming Languages. Lecture Java Programming Language. An Introduction

The role of semantic analysis in a compiler

From synchronous models to distributed, asynchronous architectures

RCU. ò Walk through two system calls in some detail. ò Open and read. ò Too much code to cover all FS system calls. ò 3 Cases for a dentry:

Shared Channels etc.

The Dining Philosophers Problem CMSC 330: Organization of Programming Languages

VFS, Continued. Don Porter CSE 506

Concurrent Programming using Threads

Programming Kotlin. Familiarize yourself with all of Kotlin s features with this in-depth guide. Stephen Samuel Stefan Bocutiu BIRMINGHAM - MUMBAI

n Closed book n You are allowed 5 cheat pages n Practice problems available in Course Materials n Check grades in Rainbow grades

A Simple Example. The Synchronous Language Esterel. A First Try: An FSM. The Esterel Version. The Esterel Version. The Esterel Version

Formal Specification and Verification

Overview. CMSC 330: Organization of Programming Languages. Concurrency. Multiprocessors. Processes vs. Threads. Computation Abstractions

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

Tokens, Expressions and Control Structures

Programming Languages

Transcription:

A Deterministic Concurrent Language for Embedded Systems Stephen A. Edwards Columbia University Joint work with Olivier Tardieu SHIM:A Deterministic Concurrent Language for Embedded Systems p. 1/38

Definition shim \ shim\ n 1 : a thin often tapered piece of material (as wood, metal, or stone) used to fill in space between things (as for support, leveling, or adjustment of fit). 2 : Software/Hardware Integration Medium, a model for describing hardware/software systems SHIM:A Deterministic Concurrent Language for Embedded Systems p. 2/38

Robby Roto (Bally/Midway 1981) SHIM:A Deterministic Concurrent Language for Embedded Systems p. 3/38

Robby Roto Block Diagram Z80 Bus Bridge (Mux) ROM 40K Custom Address DRAM 16K SRAM 6K Custom Data Video NV SRAM 2K Sound I/O Switches Audio Left blitter Sound I/O Audio Right SHIM:A Deterministic Concurrent Language for Embedded Systems p. 4/38

HW/SW Interaction Software Blitter Memory Video Interrupt Blit Blit Blit Pixels Pixels Pixels Interrupt Line Line Line Line Line SHIM:A Deterministic Concurrent Language for Embedded Systems p. 5/38

SHIM Wishlist Concurrent Hardware always concurrent Mixes synchronous and asynchronous styles Need multi-rate for hardware/software systems Only requires bounded resources Hardware resources fundamentally bounded Formal semantics Do not want arguments about what something means Scheduling-independent Want the functionality of a program to be definitive Always want simulated behavior to reflect reality Verify functionality and performance separately SHIM:A Deterministic Concurrent Language for Embedded Systems p. 6/38

The SHIM Model Sequential processes Dynamic but statically predictable topology Asynchronous Synchronous communication events Unbuffered one-to-many communication channels exchange data tokens Delay-insensitive: sequence of data through any channel independent of scheduling policy (the Kahn principle) Kahn networks with rendezvous communication SHIM:A Deterministic Concurrent Language for Embedded Systems p. 7/38

Modeling Time in SHIM SHIM is timing-independent Philosophy: separate functional requirements from performance requirements Like synchronous digital logic: establish correct function independent of timing, then check and correct performance errors Vision: clock processes impose execution rates, checked through static timing analysis SHIM:A Deterministic Concurrent Language for Embedded Systems p. 8/38

Basic SHIM An imperative language with familiar C/Java-like syntax int32 gcd(int32 a, int32 b) { while (a!= b) { if (a > b) a -= b; else b -= a; return a; struct foo { int x; bool y; uint15 z; int<-3,5> w; int8 p[10]; bar q; ; // Composite types // Explicit-width integers // Explicit-range integers // Arrays // Recursive types SHIM:A Deterministic Concurrent Language for Embedded Systems p. 9/38

Four Additional Constructs stmt 1 par stmt 2 next var try stmt 1 catch( exc ) stmt 2 throw exc Run stmt 1 and stmt 2 concurrently Send or receive next value of var Define and handle an exception Raise an exception SHIM:A Deterministic Concurrent Language for Embedded Systems p. 10/38

Concurrency & par Par statements run concurrently and asynchronously Terminate when all terminate Each thread gets private copies of variables; no sharing Writing thread sets the variable s final value void main() { int a = 3, b = 7, c = 1; { a = a + c; // a 4, b = 7, c = 1 a = a + b; // a 11, b = 7, c = 1 par { b = b - c; // a = 3, b 6, c = 1 b = b + a; // a = 3, b 9, c = 1 // a 11, b 9, c = 1 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 11/38

Restrictions Both pass-by-reference and pass-by-value arguments Simple syntactic constraints avoid nondeterministic races void f(int &x) { x = 1; // x passed by reference void g(int x) { x = 2; // x passed by value void main() { int a = 0, b = 0; a = 1; par b = a; a = 1; par a = 2; // OK: a and b modified separately // Error: a modified by both f(a); par f(b); // OK: a and b modified separately f(a); par g(a); // OK: a modified by f only g(a); par g(a); // OK: a not modified f(a); par f(a); // Error: a passed by reference twice SHIM:A Deterministic Concurrent Language for Embedded Systems p. 12/38

Communication & next next a reads or writes next value of variable a Blocking: thread waits for all processes that know about a // a is a copy of c a = 3; // change local copy next a; // receive (wait for g) // a now 5 void f(int a) { void g(int &b) { // b is an alias of c b = 5; // sets c next b; // send (wait for f) // b still 5 void main() { int c = 0; f(c); par g(c); SHIM:A Deterministic Concurrent Language for Embedded Systems p. 13/38

Synchronization and Deadlocks Blocking communication makes for potential deadlock { next a; next b; par { next b; next a; // deadlocks Only threads responsible for a variable must synchronize { next a; next b; par next b; par next a; // OK When a thread terminates, it is no longer responsible { next a; next a; par next a; // OK Philosophy: deadlocks easy to detect; races are too subtle SHIM prefers deadlocks to races (always reproducible) SHIM:A Deterministic Concurrent Language for Embedded Systems p. 14/38

Exceptions Sequential semantics are classical void main() { int i = 1; try { throw T; i = i * 2; catch (T) { i = i * 3; // Not executed // Executed by throw T // i = 3 on exit SHIM:A Deterministic Concurrent Language for Embedded Systems p. 15/38

Exceptions & Concurrency void main() { int i = 0, j = 0; try { while (i < 5) next i = i + 1; throw T; par { for (;;) { next i; j = i + 1; next j; par { for (;;) next j; catch (T) { Exceptions propagate through communication actions to preserve determinism Idea: transitive poisoning Raising an exception poisons a process Any process attempting to communicate with a poisoned process is itself poisoned (within exception scope) Best effort preemption SHIM:A Deterministic Concurrent Language for Embedded Systems p. 16/38

An Example void main() { uint8 A, B, C; { // source: generate four values next A = 17; next A = 42; next A = 157; next A = 8; par { // : copy from input to output for (;;) next B = next A; par { // : copy, add 1 alternately for (;;) { next C = next B; next C = next B + 1; par { // sink for (;;) next C; source sink A B C SHIM:A Deterministic Concurrent Language for Embedded Systems p. 17/38

sender c=0 c=1 Communication Patterns receiver d=1 c=1 c=0 d=2 c=1 c=2 c=1 c=1 c=0 d=3 c=1 c=3 c=1 c=2 c=1 c=1 c=0 d=4 sink { d = 0; for (;;) { e = d; while (e > 0) { next c = 1; next c = e; e = e - 1; next c = 0; next d = d + 1; par { a = b = 0; for (;;) { do { if (next c!= 0) a = a + next c; while (c); b = b + 1; par { for (;;) next d; SHIM:A Deterministic Concurrent Language for Embedded Systems p. 18/38

Recursion & Concurrency A bounded FIFO: compiler will analyze & expand void buffer1(int input, int &output) { for (;;) next output = next input; void fifo(int n, int input, int &output) { if (n == 1) buffer1(input, output); else { int channel; buffer1(intput, channel); par fifo(n-1, channel, output); SHIM:A Deterministic Concurrent Language for Embedded Systems p. 19/38

Robby Roto in SHIM start-of-frame Pixel Clock Software more command Blitter frame Video out pixels pixel buffer buffer sync while (player is alive) next start-of-frame;...game logic... next more = true; next command =...;...game logic... next more = false; for (;;) while (next more) next command; Write to buffer next frame = buffer; for (;;) next start-of-frame; for each line next sync =...; for each pixel next clock Read pixel next pixel =...; buffer = next frame; SHIM:A Deterministic Concurrent Language for Embedded Systems p. 20/38

Generating Software from SHIM SHIM:A Deterministic Concurrent Language for Embedded Systems p. 21/38

One function void run() { for (;;) { switch (pc1) { case 0: block A pc1 = 1; break; case 1: block C Faking Concurrency in C switch (pc2) { case 0: block B pc2 = 1; break; case 1: block D SHIM:A Deterministic Concurrent Language for Embedded Systems p. 22/38

Faking Concurrency in C One function void run() { for (;;) { switch (pc1) { case 0: block A pc1 = 1; break; case 1: block C switch (pc2) { case 0: block B pc2 = 1; break; case 1: block D Multiple Functions void run() { for (;;) run1(), run2(); void run1() { static pc1; switch (pc1) { case 0: block A pc1 = 1; return; case 1: block C void run2() { static pc2; switch (pc2) { case 0: block B pc2 = 1; return; case 1: block D SHIM:A Deterministic Concurrent Language for Embedded Systems p. 22/38

Faking Concurrency in C One function void run() { for (;;) { switch (pc1) { case 0: block A pc1 = 1; break; case 1: block C switch (pc2) { case 0: block B pc2 = 1; break; case 1: block D Multiple Functions void run() { for (;;) run1(), run2(); void run1() { static pc1; switch (pc1) { case 0: block A pc1 = 1; return; case 1: block C void run2() { static pc2; switch (pc2) { case 0: block B pc2 = 1; return; case 1: block D Tail Recursion void run1a() { block A *(sp++) = run2a; (*(--sp))(); return; void run1b() { block C *(sp++) = run2b; (*(--sp))(); return; void run2a() { block B *(sp++) = run1b; (*(--sp))(); return; void run2b() { block D (*(--sp))(); return; SHIM:A Deterministic Concurrent Language for Embedded Systems p. 22/38

Dividing into Fragments void source(int32 &C) { bool b = 0; for (int32 a = 0 ; a < 42 ; ) { if (b) { next C = a; else { for (int32 d = 0 ; Exit d < 10 ; ++d) a = a + 1; b = ~b; Extended basic blocks... b=0 a=0 a<42 b d=0 C=a d<10 next C a=a+1 d=d+1 b=~b SHIM:A Deterministic Concurrent Language for Embedded Systems p. 23/38

Global Data void (*stack[3])(void); void (**sp)(void); struct channel { void (*reader)(void); void (*writer)(void); ; struct channel A_ch = { 0, 0 ; struct channel B_ch = { 0, 0 ; struct channel C_ch = { 0, 0 ; unsigned char A, B, C; struct { char blocked; source = { 0 ; struct { char blocked; unsigned char tmp; = { 0 ; struct { char blocked; unsigned char tmp; = { 0 ; struct { char blocked; sink = { 0 ; Stack of pointers to runnable functions Each channel holds pointer to function (process) to resume after communication Blocked flag for each process Each process broken into tail-recursive atomic functions SHIM:A Deterministic Concurrent Language for Embedded Systems p. 24/38

Source writing to via A void source_0() { A = 17; // Write to channel if (.blocked && A_ch.reader) { // If buffer is blocked reading,.blocked = 0; // Unblock A *(sp++) = A_ch.reader; // schedule the reader, and A_ch.reader = 0; // clear the channel. source.blocked = 1; A_ch.writer = source_1; (*(--sp))(); return; // Block us // to continue below // Run next process void source_1() { /*... */ // Continue here after the write SHIM:A Deterministic Concurrent Language for Embedded Systems p. 25/38

Buf1 reading from source via A void _0() { if (source.blocked && A_ch.writer) { // If source is blocked, _1(); return; // goto _1.blocked = 1; A_ch.reader = _1; (*(--sp))(); return; // Block us // to continue below // Run next process void _1() {.tmp = A; source.blocked = 0; *(sp++) = A_ch.writer; A_ch.writer = 0; // Read from the channel // Unblock the source, // schedule it, and // clear the channel. SHIM:A Deterministic Concurrent Language for Embedded Systems p. 26/38

Compiling Processes Together source sink A B C Build an automaton through abstract simulation State signature: Running/blocked status of each process Blocked on reading/writing status of each channel Trick: does not include control or data state of each process SHIM:A Deterministic Concurrent Language for Embedded Systems p. 27/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 ready blocked PCs PCs {1, 2 {3 A clear C waiting for writer B waiting for reader SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 ready blocked PCs PCs {1, 2 {3 A clear C waiting for writer B waiting for reader SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs {1, 2 {3 A clear C waiting for writer B waiting for reader SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs {1, 2 {3 {3 {6 A clear C waiting for writer B waiting for reader SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs {1, 2 {3 {3 {6 {2 {6 A clear C waiting for writer B waiting for reader SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs {1, 2 {3 PCs A clear C waiting for writer B waiting for reader {3 {6 {2 {6 {2 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs {1, 2 {3 PCs A clear C waiting for writer B waiting for reader {3 {6 {2 {6 {2 {5 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs {1, 2 {3 PCs A clear C waiting for writer B waiting for reader {3 {6 {2 {6 {2 {5 {3 {5 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready {3 {6 blocked PCs PCs {2 {6 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5 {2 {5 {3 {5 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5 {2 {5 {3 {5 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5 {2 {5, 7 {3 {5 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5 {2 {5, 7 {3 {5 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5 {2 {5, 7 {3 {5, 7 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 {3 {5, 7 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6, 7 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 {3 {5, 7 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6, 7 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 {3 {5, 7 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6 ready blocked PCs PCs send C {3 {6 {2 {5, 6, 7 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 send C {3 {5, 7 {3 {5, 7 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6, 8 ready blocked PCs PCs send C {3 {6 {2 {5, 6, 7 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 send C {3 {5, 7 {3 {5, 7 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6, 8 ready blocked PCs PCs send C {3 {6, 8 {2 {5, 6, 7 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 send C {3 {5, 7 {3 {5, 7 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6, 8 ready blocked PCs PCs send C {3 {6, 8 {2 {5, 6, 7, 8 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 send C {3 {5, 7 {3 {5, 7 {3 {5 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6, 8 ready blocked PCs PCs send C {3 {6, 8 {2 {5, 6, 7, 8 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 send C {3 {5, 7 {3 {5, 7 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6, 8 ready blocked PCs PCs send C {3 {6, 8 {2 {5, 6, 7, 8 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 send C {3 {5, 7 {3 {5, 7 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Abstract Simulation { // 1 for (;;) 2 next B = 3 next A; par { // 4 for (;;) { 5 next C = 6 next B; 7 next C = 8 next B + 1; {1 {4 {1 {6 {3 {6, 8 ready blocked PCs PCs send C {3 {6, 8 {2 {5, 6, 7, 8 {1, 2 {3 A clear C waiting for writer B waiting for reader {2 {5, 7 {2 {5, 7 send C {3 {5, 7 {3 {5, 7 {3 {5, 7 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 28/38

Example Lines Processes Benchmarks Berkeley 36 3 Buffer2 25 4 Buffer3 26 5 Buffer10 33 12 Esterel1 144 5 Esterel2 127 5 FIR5 78 19 FIR19 190 75 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 29/38

Executable Sizes Example Switch Tail- Static (partial) Static (full) Recursive size states size states Berkeley 860 1299 1033 5 551 6 Buffer2 832 1345 1407 10 403 8 Buffer3 996 1579 1771 20 443 10 Buffer10 2128 3249 5823 174 687 24 Esterel1 3640 5971 8371 49 5611 56 Esterel2 4620 7303 6871 24 2539 18 FIR5 4420 6863 6819 229 1663 79 FIR19 17052 25967 67823 2819 7287 372 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 30/38

Speedups vs. Switch Example Tail-Recursive Static (partial) Static (full) Berkeley 2.9 2.6 7.8 Buffer2 2.0 2.4 11 Buffer3 2.1 2.6 10 Buffer10 1.7 4.8 12 Esterel1 1.9 2.9 5.9 Esterel2 2.0 2.5 5.2 FIR5 0.92 4.8 7 FIR19 0.90 5.9 7.1 SHIM:A Deterministic Concurrent Language for Embedded Systems p. 31/38

Generating Hardware from SHIM SHIM:A Deterministic Concurrent Language for Embedded Systems p. 32/38

CFG Node Hardware IR Control Fragment Datapath Fragment Assignment v = e e Decision e e Merge Cycle Boundary... SHIM:A Deterministic Concurrent Language for Embedded Systems p. 33/38

Translation Patterns e s 2 s 1 e s if ( e ) s 1 else s 2 while ( e ) s c = e next c = e v = c v = next c SHIM:A Deterministic Concurrent Language for Embedded Systems p. 34/38

Hardware Translation d = 0 1 e = d e c = 0 d = 1 c = 1 c = e e = 1 a = 0 b = 0 1 r = 1 r b += 1 r = c r v = c a += v { d = 0; for (;;) { e = d; while (e > 0) { next c = 1; next c = e; e = e - 1; next c = 0; next d = d + 1; par { a = b = 0; for (;;) { do { if (next c!= 0) a = a + next c; while (c); b = b + 1; par { for (;;) next d; SHIM:A Deterministic Concurrent Language for Embedded Systems p. 35/38

Conclusions The SHIM Model: Sequential processes communicating through rendezvous Sequential language plus concurrency, communication, and exceptions. Scheduling-independent Kahn networks with rendezvous Nondeterministic scheduler produces deterministic behavior SHIM:A Deterministic Concurrent Language for Embedded Systems p. 36/38

Software generation Conclusions Tail-recursion for simulating concurrency Dynamic code maintains stack of function pointers to runnable processes Processes compiled together w/ abstract simulation Hardware generation Hardware IR: actions, decisions, merges, and registers Syntax-directed translation from IR SHIM:A Deterministic Concurrent Language for Embedded Systems p. 37/38

Future Work Automata abstract communication patterns Useful for deadlock detection, protocol violation SHIM:A Deterministic Concurrent Language for Embedded Systems p. 38/38

Future Work Automata abstract communication patterns Useful for deadlock detection, protocol violation Synthesis for multicore processors Compile together the processes on each core SHIM:A Deterministic Concurrent Language for Embedded Systems p. 38/38

Future Work Automata abstract communication patterns Useful for deadlock detection, protocol violation Synthesis for multicore processors Compile together the processes on each core Hardware/software cosynthesis Bounded subset has reasonable hardware semantics SHIM:A Deterministic Concurrent Language for Embedded Systems p. 38/38

Future Work Automata abstract communication patterns Useful for deadlock detection, protocol violation Synthesis for multicore processors Compile together the processes on each core Hardware/software cosynthesis Bounded subset has reasonable hardware semantics Convince world: deterministic concurrency is good SHIM:A Deterministic Concurrent Language for Embedded Systems p. 38/38