METROII AND PTOLEMYII INTEGRATION. Presented by: Shaoyi Cheng, Tatsuaki Iwata, Brad Miller, Avissa Tehrani

Similar documents
SystemC Modules and Hierarchy. Rolf Drechsler Daniel Große University of Bremen

Electronic System Level Design Introduction to SystemC

Experience the Next ~Wave~ of Analog and Digital Signal Processing using SystemC AMS 2.0 Session 1: SystemC AMS Introduction

Hierarchical FSMs with Multiple CMs

SystemC. Short Introduction

SystemC 1.3. Languages for Embedded Systems. Prof. Stephen A. Edwards Summer 2004 NCTU, Taiwan

Introduction to Programming Using Java (98-388)

Meta-Data-Enabled Reuse of Dataflow Intellectual Property for FPGAs

fakultät für informatik informatik 12 technische universität dortmund Data flow models Peter Marwedel TU Dortmund, Informatik /10/08

Giotto Domain. 5.1 Introduction. 5.2 Using Giotto. Edward Lee Christoph Kirsch

Version 2.0 User s Guide

Simulation and Exploration of LAURA Processor Architectures with SystemC

UC Berkeley Mobies Technology Project

SDL. Jian-Jia Chen (slides are based on Peter Marwedel) TU Dortmund, Informatik 年 10 月 18 日. technische universität dortmund

Version 1.1 User s Guide

MODELING LANGUAGES AND ABSTRACT MODELS. Giovanni De Micheli Stanford University. Chapter 3 in book, please read it.

Modal Models in Ptolemy

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

SDF Domain. 3.1 Purpose of the Domain. 3.2 Using SDF Deadlock. Steve Neuendorffer

Kepler: An Extensible System for Design and Execution of Scientific Workflows

Adding a Java GUI to SystemC Simulation for Virtual Prototyping of Embedded Systems

TEACHING COMPUTER ORGANIZATION AND ARCHITECTURE USING SYSTEMC *

ECEN 468 Advanced Logic Design Department of Electrical and Computer Engineering Texas A&M University. Lab 1

Contemporary Design. Traditional Hardware Design. Traditional Hardware Design. HDL Based Hardware Design User Inputs. Requirements.

ECEN 468 Advanced Logic Design

Hardware-Software Codesign. 6. System Simulation

The Ptolemy II Framework for Visual Languages

SystemCoDesigner: System Programming Tutorial

Component-Based Design of Embedded Control Systems

FSMs & message passing: SDL

Process-Based Software Components Final Mobies Presentation

MoCC - Models of Computation and Communication SystemC as an Heterogeneous System Specification Language

KDEC

LabVIEW: Visual Programming Using a Dataflow Model Extended With Graphical Control Structures. Outline

DELHI PUBLIC SCHOOL TAPI

Embedded Software from Concurrent Component Models

A Code Generation Framework for Actor-Oriented Models with Partial Evaluation

SimWORKS, A Hybrid Java/C++ Simulation Platform

SysteMoC. Verification and Refinement of Actor-Based Models of Computation

Unit 2: High-Level Synthesis

DYNAMIC ARRAYS; FUNCTIONS & POINTERS; SHALLOW VS DEEP COPY

Introduction to Electronic Design Automation. Model of Computation. Model of Computation. Model of Computation

What are the characteristics of Object Oriented programming language?

Die virtuelle Plattform:

Parallel System Architectures 2016 Lab Assignment 1: Cache Coherency

4 th European SystemC Users Group Meeting

CS1622. Semantic Analysis. The Compiler So Far. Lecture 15 Semantic Analysis. How to build symbol tables How to use them to find

Embedded System Design and Modeling EE382V, Fall 2008

Simulation of LET Models in Simulink and Ptolemy

AP COMPUTER SCIENCE JAVA CONCEPTS IV: RESERVED WORDS

Homework 4. Any questions?

A Code Generation Framework for Actor-Oriented Models with Partial Evaluation

Lecture 15a Persistent Memory & Shared Pointers

Graphical System Design. David Fuller LabVIEW R&D Section Manager

System-Level Design Languages: Orthogonalizing the Issues

Software Synthesis from Dataflow Models for G and LabVIEW

System-level design refinement using SystemC. Robert Dale Walstrom. A thesis submitted to the graduate faculty

Using Vergil. This section shows how to start Vergil, how to execute and explore pre-built models, and how to construct your own models.

Advanced Tool Architectures. Edited and Presented by Edward A. Lee, Co-PI UC Berkeley. Tool Projects. Chess Review May 10, 2004 Berkeley, CA

EEC-484/584 Computer Networks

LabVIEW Based Embedded Design [First Report]

CSE 333 Lecture smart pointers

Heterogeneous Physical Modeling Jim Armstrong Professor, ECE, Va. Tech

Real-time C Code Generation in Ptolemy II for the Giotto Model of Computation

Where we are so far. Intro to Data Integration (Datalog, mediators, ) more to come (your projects!): schema matching, simple query rewriting

HDL Cosimulation August 2005

A Quick Tour p. 1 Getting Started p. 1 Variables p. 3 Comments in Code p. 6 Named Constants p. 6 Unicode Characters p. 8 Flow of Control p.

The Future of the Ptolemy Project

Building Synchronous DataFlow graphs with UML & MARTE/CCSL

CSE 333 Lecture smart pointers

FINAL TERM EXAMINATION SPRING 2010 CS304- OBJECT ORIENTED PROGRAMMING

Design for Verification in System-level Models and RTL

Visual Profiler. User Guide

Getting Started with TLM-2.0

Static Analysis of Actor Networks

Structured bindings with polymorphic lambas

CS 471 Operating Systems. Yue Cheng. George Mason University Fall 2017

Actor-Oriented Design: Concurrent Models as Programs

JPEG Compression/Decompression using SystemC

Configuration Provider: A Pattern for Configuring Threaded Applications

Simulation Verification of multiple levels of constraints for system level designs in systemc

DIGITAL VS. ANALOG SIGNAL PROCESSING Digital signal processing (DSP) characterized by: OUTLINE APPLICATIONS OF DIGITAL SIGNAL PROCESSING

Chapter 27 Cluster Work Queues

HDL Cosimulation May 2007

Learning Objectives. C++ For Artists 2003 Rick Miller All Rights Reserved xli

A Heterogeneous Approach for Wireless Network Simulations

Designing with SystemC: Multi-Paradigm Modeling and Simulation Performance Evaluation

Overview of Dataflow Languages. Waheed Ahmad

USING THE SYSTEM-C LIBRARY FOR BIT TRUE SIMULATIONS IN MATLAB

Actor-Oriented Design and The Ptolemy II framework

CS112 Lecture: Defining Instantiable Classes

Chapter 16. Base Code Generation Domain and Supporting Classes

Simulink -based Programming Environment for Heterogeneous MPSoC

Integration of OpenModelica in Ptolemy II

Protocols SPL/ SPL

PowerSC: a SystemC Framework for Power Estimation

SoC Design. Prof. Dr. Christophe Bobda Institut für Informatik Lehrstuhl für Technische Informatik

Tutorial: Building Ptolemy II Models Graphically

CSCI 171 Chapter Outlines

Lecture Notes CPSC 224 (Spring 2012) Today... Java basics. S. Bowers 1 of 8

Transcription:

METROII AND PTOLEMYII INTEGRATION Presented by: Shaoyi Cheng, Tatsuaki Iwata, Brad Miller, Avissa Tehrani

INTRODUCTION PtolemyII is a tool for design of component-based systems using heterogeneous modeling techniques. PtolemyII studies modeling, simulation, and design of concurrent, real-time embedded systems. Different MoCs such as Synchronous Dataflow (SDF) and Finite State Machines (FSM) can be constructed in PtolemyII. Directors define how actors in the design fire and how tokens are used to communicate between them. 2

INTRODUCTION MetroII is a framework for platform-based design which allows functionality to be assigned to architecture. A platform-based design methodology offers separation of concerns between architecture and functionality By defining these two parts of a design through a set of clearly defined abstractions and systematically mapping functionality onto architecture, structured design space exploration is facilitated. 3

MOTIVATION Developing functionality to interface PtolemyII with MetroII would allow more flexibility and efficiency in implementation of PtolemyII models. The objective of our project is to allow users to describe a system using the PtolemyII graphical user interface and to produce a MetroII description of the system which maintains the semantics of the original PtolemyII model. This means that designers are able to graphically build their functional models in PtolemyII and map them onto virtual architecture models in MetroII. This flow will allow developers to efficiently explore the design space in the early stages of development. 4

MOTIVATION Currently, PtolemyII can generate C code for SDF, FSM and HDF models. The goal of this project is to add a module to the PtolemyII code generator to create MetroII descriptions of PtolemyII models. The MetroII descriptions can be used to implement the functionality described by the PtolemyII model on a particular architecture. 5

SCOPE OF TASK In principle, there are many similarities between a MetroII and SystemC description of a system. As none of our group members are regular developers for MetroII, we preferred work on SystemC because it is more stable and better documented. We started with the Synchronous Dataflow domain, as the semantics of this domain seem easiest to maintain in SystemC. In order to simplify the design, we have temporarily restricted ourselves to designs which only require a size 1 buffer between the modules. 6

7 ANALYSIS

ANALYSIS Our SystemCCodeGenerater is based on CCodeGenerater of PtolemyII. CCodeGenerator uses Helpers and Templates for C. Reuse of this approach is possible if several key differences are addressed. Comparison of the C code generated by CCodeGenerator and handcrafted SystemC code done manually. Major differences Variable declaration and initialization Data transmission Firing scheduling 8

VARIABLE DECLARATION & INITIALIZATION Generated C Code Based on procedural programming Variable declarations are generated in a group Initialization of parameters is also in a group SystemC Code Based on Object-oriented Programming Variable declarations are in module declaration (SC_MODULE) Initialization process is called in constructor (SC_CTOR) 9

CODE COMPARISON (VARIABLE DECLARATION) Generated C Code SystemC Code /* Declaration of parameters */ int Actor1_param1; int Actor2_param1;. /* Firing functions for each actor */ Actor1( ){ set value; Actor2( ){ initialzie(){ Actor1_param1 = 0; Actor2_param2 = 2; SC_MODULE(Actor1){ int param1; SC_CTOR(Actor1){ Actor1::initialize( ){ param1 = 0; Actor1::fire( ){ SC_MODULE(Actor2){ SC_METHOD(fire( )); initialize( ); int param2; SC_CTOR(Actor2){ SC_METHOD(fire( )); initialize( ); Actor2::initialize( ){ Actor2::fire( ){. 10

DATA TRANSMISSION Generated C Code The preceding actor s fire function sets the following actor s input value directly. Actor1 out Actor1 ( ) Actor2 in SystemC Code Data is transferred through ports and channels. Actor1 write() out channel Actor2 read() in Out port In port 11

CODE COMPARISON (DATA TRANSMISSION) Generated C Code /* input and output value */ int Actor1_out; int Actor2_in; /* firing function */ Actor1( ){ Actor2_in = Actor1_out; SystemC Code SC_MODULE(Actor1){ sc_out<int> in_port; int a1_value; Actor1::fire( ){ out_port.write(a1_velue); SC_MODULE(Actor2){ sc_in<int> out_port; int a2_value; Actor2:fire( ){ a2_value= in_port.read(); void sc_main(){ sc_buffer<int> wire; // channel Actor1 Actor1_inst; // instance Actor2 Actor2_inst; Actor1_inst.out_port(wire); // connection Actor2_ins.in_port(wire); 12

FIRING SCHEDULING Generated C Code Fire functions of each actor are invoked in order assigned by Director. Actor1 Director Actor3 input Actor2( ) Actor1( ) Actor2 SystemC Code Director module sends a trigger signal to a special trigger port of each actor. trigger Director trigger trigger Actor3 data 13 Actor1 data Actor2

CODE COMPARISON (FIRING SCHEDULING) Generated C Code SystemC Code void main { int iteration=10; // get from model // firing in order scheduled by director for(int i=0; i<iterations; i++){ Actor1( ); Actor2( ); SC_MODULE(Director){ sc_out<bool> firetrigger[n]; Director::fire( ){ for(int i=0; i<iterations; i++){ firetrigger.wirte(true); void sc_main(){ /* trigger channel*/ sc_buffer<bool> trigger[n]; /* trigger connection */ Director_inst.fireTrigger(trigger[0]); Actor1_inst.trigger(trigger[0]); Director_inst.fireTrigger(trigger[1]); Actor2_inst.trigger(trigger[1]); /* run simulation */ sc_start(); 14

CHALLENGES IN DEVELOPMENT Variable Declaration & Initialization Reallocate the declaration code per corresponding module. Data Transmission Generate the code for I/O port of each actor. Generate the declaration of the data channel and connection with ports. Firing Scheduling Create director module declaration Generate director s firing process in correct order. Generate the declaration of the trigger channels and connection with trigger ports of every actor. 15

DESIGN AND IMPLEMENTATION

OVERVIEW Modularization Tagging when code is generated for each actor Regroup when code is ready for output Generation of connections between modules Link different modules for data communication A separate director module (scheduler) A director module which coordinates the dataflow Fires each actor in the right order 17

MODULARIZATION Try to leverage the existing codegen infrastructure Problem: code was generated in sections (instead of modules) to match the procedural nature of C Declaration Initialization Firing Each of the sections contains code from all actors Need a way to break them down 18

MODULARIZATION Even though C is procedural, a Ptolemy model itself is modular The original codegen has to traverse lists of actors for generation of operations for each of them Each actor generates its own code for each section and the code segments are reassembled to complete each section Modular structure can be restored Methodology employed Tagging and regrouping 19

MODULARIZATION: TAGGING For each section, a tag is added before code snippets from each actor are combined Information in tags Instance name of actors Necessary as multiple instantiation of the same actor can behave differently Delimits the boundaries between pieces of code from different actors 20

MODULARIZATION: REGROUPING Code segments are re-parsed and reorganized before output Search for tags to extract the operation of each actor for each section Group all sections generated by an actor together Module declarations and function name declaration are added to wrap around the generated code 21

MODULARIZATION: EXAMPLE Original: Tagged: Regrouped: int actor1_output; int actor2_output; void initialize(){ actor1_output = 0; actor2_output = 0; void actor1() { actor1_output +=1; /***actor1***/ int actor1_output; /***end actor1 ***/ /***actor2***/ int actor2_output; /***end actor2***/ void initialize() { /***actor1***/ actor1_output = 0; /***end actor1***/ /***actor2***/ SC_MODULE(actor1) { int actor1_output; void initialize(); void fire(); SC_CTOR(actor1) { void actor1::initialize() { void actor2() actor2_output = 0; actor1_output = 0; { /***end actor2***/ actor_output += 2; void actor1() { /***actor1***/ actor1_output +=1; /***end actor1***/ void actor1::fire() { actor1_output +=1; 22

GENERATION OF CONNECTIONS In C code generation all variables are global Sender changes the value of receiver port directly Fire code of the sender SystemC is modular No direct change of value of internal members from another actor Connection is needed to pass data value 23

GENERATION OF CONNECTIONS Tagging is used again when fire code is being generated Find source and sink for each connection Parse fire code to look for assignment statement Tag a connection and annotate variable as source/sink Every connection can have one source and multiple sinks Before output, the tagged code is reparsed to generate a hashtable 24

GENERATION OF CONNECTIONS The hashtable is keyed using concatenation of the source port name and the container actor, and contains the value which points to the sink The source port is made an output port of the sender module The sink port is made an input port of the receiver module Wires are instantiated for each connection when modules are instantiated 25

GENERATION OF CONNECTIONS: EXAMPLE /****CONNECTION****/ Source:actor1_output_0:endsource Sink:actor2_input_0:endsink /****DONE CONNECTION****/ /****CONNECTION****/ Source:actor1_output_0:endsource Sink:actor3_input_1:endsink /****DONE CONNECTION****/ Hashtable. actor1_output_0:-:actor1 actor2_input_0:-:actor1 actor3_input_1:-:actor1 sc_buffer<int> wire0; actor1_inst.actor1_output_0(wire0); actor2_inst.actor2_input_0(wire0); actor3_inst.actor3_input_0(wire0); 26

A SEPARATE DIRECTOR (SCHEDULER) Instead of a simple for loop in the original C codegen, a separate scheduler is created Driven by clock signal and triggers each actor in the right order Manages max iteration count and increments the iteration index each clock tick Generated by the corresponding director class in the Ptolemy model Director class has access to the iteration count 27

A SEPARATE DIRECTOR (SCHEDULER) Acquiring the firing sequence from the generated fire code The original C codegen creates fire code in the right order Actor names embedded in the tags are used to extract the sequence for firing actors Pulls the trigger of each actor to fire Communication and control for each actor separated Trigger is a special port for control 28

A SEPARATE DIRECTOR: EXAMPLE sc_buffer<bool>trigger[actor_num]; _Ramp_SDF_Director_Ramp_SDF_Director_inst("_Ramp_SDF_Director"); _Ramp_SDF_Director_inst.trigger(CLOCK); _Ramp_SDF_Director_inst.fireTrigger[0](TRIGGER[0]); _Ramp_SDF_Director_inst.fireTrigger[1](TRIGGER[1]); _Ramp_SDF_Director_inst.fireTrigger[2](TRIGGER[2]); Director driven by clock Director firing actors in order Ramp_Ramp_inst.trigger(TRIGGER[0]); Ramp_CompositeActor_SequencePlotter_inst.trigger(TRIGGER[1]); Ramp_SequencePlotter_inst.trigger(TRIGGER[2]); 29

CODE GENERATION EXAMPLES

AVAILABLE ACTORS Ramp Sequence Plotter Composite Actor Add/Subtract Absolute Value 31

MODIFIED RAMP DEMO 32

MODIFIED RAMP DEMO: OUTPUT bmiller1@ubuntu:~/courses/ee249/demos$./ramp.bin SystemC 2.2.0 --- Dec 3 2009 17:51:01 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED Ramp_CompositeActor_SequencePlotter output 0: 0 Ramp_SequencePlotter output 0: 0 Ramp_CompositeActor_SequencePlotter output 1: 2 Ramp_SequencePlotter output 1: 2 Ramp_CompositeActor_SequencePlotter output 2: 4 Ramp_SequencePlotter output 2: 4 Ramp_CompositeActor_SequencePlotter output 3: 6 Ramp_SequencePlotter output 3: 6 Ramp_CompositeActor_SequencePlotter output 4: 8 Ramp_SequencePlotter output 4: 8 Ramp_CompositeActor_SequencePlotter output 5: 10 Ramp_SequencePlotter output 5: 10 Ramp_CompositeActor_SequencePlotter output 6: 12 Ramp_SequencePlotter output 6: 12 Ramp_CompositeActor_SequencePlotter output 7: 14 Ramp_SequencePlotter output 7: 14 Ramp_CompositeActor_SequencePlotter output 8: 16 Ramp_SequencePlotter output 8: 16 Ramp_CompositeActor_SequencePlotter output 9: 18 Ramp_SequencePlotter output 9: 18 SystemC: simulation stopped by user. 33

MODIFIED RAMP DEMO: ACTOR CODE /* Actor: Ramp_Ramp */ SC_MODULE(Ramp_Ramp) { sc_out<int> Ramp_Ramp_output_0_port; /* trigger input */ sc_in<bool> trigger; /* Ramp's referenced parameter declarations. */ int Ramp_Ramp_step_; /* Ramp's type convert variable declarations. */ int Ramp_Ramp_output_0; ; void Ramp_Ramp::initialize() { /* Ramp's parameter initialization */ Ramp_Ramp_step_ = 2; /* initialize Ramp */ Ramp_Ramp state = 0; void Ramp_Ramp::fire() { /* Fire Ramp */ Ramp_Ramp_output_0 = Ramp_Ramp state; Ramp_Ramp state += Ramp_Ramp_step_; Ramp_Ramp_output_0_port.write (Ramp_Ramp_output_0); /* Actor: Ramp_SequencePlotter */ SC_MODULE(Ramp_SequencePlotter) { sc_in<int>ramp_sequenceplotter_input_0 port; /* trigger input */ sc_in<bool>trigger; /* SequencePlotter's input variable declarations. */ double Ramp_SequencePlotter_input[1]; /* preinitsequenceplotter */ double Ramp_SequencePlotter xvalue; ; void Ramp_SequencePlotter::initialize() { /* initsequenceplotter */ Ramp_SequencePlotter xvalue = 0.0; void Ramp_SequencePlotter::fire() { Ramp_SequencePlotter_input[0] = ((double) Ramp_SequencePlotter_input_0 port.read()); /* Fire SequencePlotter */ cout << "Ramp_SequencePlotter output" << " "<<Ramp_SequencePlotter xvalue << ": <<Ramp_SequencePlotter_input[0]<<"\n"; Ramp_SequencePlotter xvalue++; 34

MODIFIED RAMP DEMO: DIRECTOR & MAIN /* main part */ int sc_main(int argc, char *argv[]) { sc_clock CLOCK("clock"); sc_buffer<bool>trigger[actor_num]; _Ramp_SDF_Director_Ramp_SDF_Director_inst ("_Ramp_SDF_Director"); _Ramp_SDF_Director_inst.trigger(CLOCK); _Ramp_SDF_Director_inst.fireTrigger[0](TRIGGER[0]); _Ramp_SDF_Director_inst.fireTrigger[1](TRIGGER[1]); _Ramp_SDF_Director_inst.fireTrigger[2](TRIGGER[2]); Ramp_RampRamp_Ramp_inst("Ramp_Ramp"); Ramp_Ramp_inst.trigger(TRIGGER[0]); Ramp_CompositeActor_SequencePlotterRamp _CompositeActor_SequencePlotter_inst ("Ramp_SequencePlotter"); Ramp_CompositeActor_SequencePlotter_inst.trigger (TRIGGER[1]); Ramp_SequencePlotterRamp_SequencePlotter_inst ("Ramp_CompositeActor_SequencePlotter"); Ramp_SequencePlotter_inst.trigger(TRIGGER[2]); sc_buffer<int> wire0; Ramp_Ramp_inst.Ramp_Ramp_output_0_port(wire0); Ramp_SequencePlotter_inst.Ramp_SequencePlotter _input_0 port(wire0); Ramp_CompositeActor_SequencePlotter_inst.Ramp _CompositeActor_SequencePlotter_input _0 port(wire0); sc_start(); exit(0); /* Director: _Ramp_SDF_Director */ SC_MODULE(_Ramp_SDF_Director) { /* clock trigger input */ sc_in<bool>trigger; /* fire trigger output */ sc_out<bool>firetrigger[actor_num]; int_count; int iterations; ; void _Ramp_SDF_Director::initialize() { iterations = 10; _count = 0; void _Ramp_SDF_Director::fire() { while(true) { for(int i=0; i<actor_num; i++) { firetrigger[i] = true; wait(sc_zero_time); _count++; if(_count >= iterations) { sc_stop(); 35 wait();

ABSOLUTE VALUE DEMO bmiller1@ubuntu:~/courses/ee249/ demos$./abs_with_neg.bin SystemC 2.2.0 --- Dec 3 2009 17:51:01 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED abs_sequenceplotter output 0: 5 abs_sequenceplotter output 1: 3 abs_sequenceplotter output 2: 1 abs_sequenceplotter output 3: 1 abs_sequenceplotter output 4: 3 abs_sequenceplotter output 5: 5 abs_sequenceplotter output 6: 7 abs_sequenceplotter output 7: 9 abs_sequenceplotter output 8: 11 abs_sequenceplotter output 9: 13 SystemC: simulation stopped by user. 36

ADDER DEMO bmiller1@ubuntu:~/courses/ee249/demos$./ Ramp2.bin SystemC 2.2.0 --- Dec 3 2009 17:51:01 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED Ramp2_SequencePlotter2 output 0: 3 Ramp2_SequencePlotter2 output 1: 6 Ramp2_SequencePlotter2 output 2: 9 Ramp2_SequencePlotter2 output 3: 12 Ramp2_SequencePlotter2 output 4: 15 Ramp2_SequencePlotter2 output 5: 18 Ramp2_SequencePlotter2 output 6: 21 Ramp2_SequencePlotter2 output 7: 24 Ramp2_SequencePlotter2 output 8: 27 Ramp2_SequencePlotter2 output 9: 30 37

DESIGN CHALLENGES Multiple inputs Incompatible with native data-driven control Addressed in our design by trigger ports Multiple tokens on single buffer Would prohibit simply connecting actor data ports with wires Buffers would need to be statically sized Synchronization would be needed between actors and buffers so that no data is lost 38

CONCLUSION This project is an attempt to extend PtolemyII code generator to generate a MetroII description We restricted our scope to SDF model and SystemC code generator as a first version of our work. Our initial step of code modification was to modify the C code generator to output only the firing code for each actor. The SystemC code generated by this project is similar to MetroII code 39