cfsm - Codesign Finite State Machine generater

Posted at 2008/09/22 12:17 // in Research // by Daniel

http://www.mindrot.org/projects/cfsm/

FSM 스펙을 텍스트로 받아서 C 코드(템플릿)을 만들어주는 프로그램이랍니다.


아래와 같은 샘플 스펙 텍스트가 있을 때

image

image

이런 그래프로 나타낼 수 있는 코드를 생성해줍니다.

cvs로 다음과 같이 다운받습니다.

$ cvs -d anoncvs@anoncvs.mindrot.org/cvs checkout mtemplate cfsm

그리고 mtemplate와 cfsm을 make

$ cd mtemplate
$ make
$ cd ../cfsm
$ make

그러면 cfsm 파일도 생기고 기본적인 테스트도 돌립니다.

테스트로 만든 소스는 cfsm/regression에 있습니다.

C코드를 생성하려면 다음과 같이 하면 됩니다.(-d 옵션)

$ ../cfsm  -t.. -d -o t_ex0_fsm.c ../example.fsm
cfsm: Writing C source to "t_ex0_fsm.c"
cfsm: Writing C header to "t_ex0_fsm.h"

만일 스테이트 다이어그램 그림으로 만들어보고 싶으면(graphviz가 깔려있어야 함)

$ cd cfsm/regression
$ ../cfsm -t.. -g -o t_ex0_fsm.dot ../example.fsm
$ dot -Tjpg t_ex0_fsm.dot -o t_ex0_fsm.jpg

이런식으로 합니다.


# This file is in the public domain
# Damien Miller 2007-02-07

# $Id: t1_fsm.fsm,v 1.4 2007/11/18 09:51:19 djm Exp $

precondition-function-args new-state
transition-function-args none

state T1
    initial-state
    on-event T1_DONE -> T2
state T2
    on-event T2_DONE -> T3
state T3
    on-event T3_DONE1 -> T2
    on-event T3_DONE2 -> T4
state T4

이런 간단한 스펙을 바꾸면,

...생략
switch(old_state) {
case T1:
    switch (ev) {
    case T1_DONE:
        new_state = T2;
        break;
    default:
        goto bad_event;
    }
    break;
case T2:
    switch (ev) {
    case T2_DONE:
        new_state = T3;
        break;
    default:
        goto bad_event;
    }
    break;
case T3:
    switch (ev) {
    case T3_DONE1:
...후략

이런 코드가 생기고,

image

이런 그림으로 나타낼 수 있게 그래프 파일도 생성 됩니다.


Usage: cfsm [-h] [-HCD] [-o output-file] fsm-file
Command line options:
    -h               Display this help
    -d               Generate C header file in addition to source file
    -D               Only generate C header file (and not a source file)
    -g               Generate Graphviz dot file instead of C source/header
    -m template_file "Manual" output mode using user-supplied template
    -o output_file   Specify output file (default: fsm.[c|h|dot])
    -t template_dir  Specify path to C and Graphviz templates

크리에이티브 커먼즈 라이센스
Creative Commons License

이 글에는 트랙백을 보낼 수 없습니다