aki_iic’s blog

己の欲せざる処人に施す事無かれ、狂人の真似するは即ち狂人なり

dotファイルの復元

 昔書いたGraphviz用のdotファイルを紛失してしまいpdfしか残っていなかったのでリハビリの一環でgvで作成された状態遷移図から復元したがpdfとレイアウトが異なる部分がある(リフレッシュコントローラの部分)のでどちらか或いは両方に間違いがある可能性が有る。オリジナルはIBMの小林さんが書かれたCQ出版のPLD本に遡るのでステートダイヤグラム的には25年程昔に設計したと思われる。

f:id:aki_iic:20211107035450p:plain

graphvizで状態遷移図

 以下が.dotファイルでこれをgraphvizに食わせると上記 .pngを生成してくれる。

digraph {
    //rankdir=LR;
    graph [ layout = dot ];
    node [shape = doublecircle]; S0 S1 S2 S3 S4 S5 R0 R1 R2 R3 R4 R5 R6 R7;
    node [shape = parallelogram]; CPUシーケンス RFSHシーケンス;
    node [shape = ellipse]; DRAMCYC RFSHCYC;
    node [shape = rarrow]; nRAS nCAS DRAMPX nRAS_RFSH nCAS_RFSH;
    CPUシーケンス -> S0 [ label = "CPU to DRAM制御" ];
    S0 -> S1 [ label = "/AS & DRAMAREA & CPUCLK & /RFSHCYC" ];
    S1 -> S2 ;
    S2 -> S3 [ label = "CPUCLK" ];
    S3 -> S4 ;
    S4 -> S5 ;
    S5 -> S0 ;
    S1 -> DRAMCYC [ label = "Start DRAM cyc" ];
    S5 -> DRAMCYC [ label = "End DRAM cyc" ];
    S1 -> nRAS [ label = "Assert nRAS" ];
    S4 -> nRAS [ label = "Negate nRAS" ];
    S3 -> nCAS [ label = "nCAS" ];
    S5 -> nCAS [ label = "nCAS" ];
    S2 -> DRAMPX [ label = "DRAMPX->COL"];
    S5 -> DRAMPX [ label = "DRAMPX->ROW"];

    RFSHシーケンス -> R0 [ label = "DRAM RFSH制御" ];
    R0 -> R1 [ label = "AS & REFCLK & /CPUCLK & /DRAMCYC" ];
    R1 -> R2 ;
    R2 -> R3 ;
    R3 -> R4 ;
    R4 -> R5 ;
    R5 -> R6 ;
    R6 -> R7 ;
    R7 -> R0 ;
    R2 -> nRAS_RFSH [ label = "Assert CBR RFSH nRAS" ];
    R6 -> nRAS_RFSH [ label = "Negate CBR RFSH nRAS" ];
    R1 -> nCAS_RFSH [ label = "Assert CBR RFSH nCAS" ];
    R5 -> nCAS_RFSH [ label = "Negate CBR RFSH nCAS" ];
    R1 -> RFSHCYC [ label = "Start RFSH cyc" ];
    R7 -> RFSHCYC [ label = "End RFSH cyc" ];
}

 Graphvizは状態遷移図を楽して書きたい人には有難いツールでフローチャートやその他のグラフデータ系(有向・無向問わず)には便利に利用出来る。これを使うとドローソフトで状態遷移図書くのが虚しくなってくるが適材適所ということで。

2021/11/07追記:/dsackを忘れてたので追加。

f:id:aki_iic:20211107153423p:plain

状態遷移図(/dsack追加)

// 2021/11/06 : 復元
// 2021/11/07 : nDSACK追加

digraph {
    //rankdir=LR;
    graph [ layout = dot ];
    node [shape = doublecircle]; S0 S1 S2 S3 S4 S5 R0 R1 R2 R3 R4 R5 R6 R7;
    node [shape = parallelogram]; CPUシーケンス RFSHシーケンス;
    node [shape = ellipse]; DRAMCYC RFSHCYC;
    node [shape = rarrow]; nRAS nCAS DRAMPX nRAS_RFSH nCAS_RFSH nDSACK;
    CPUシーケンス -> S0 [ label = "CPU to DRAM制御" ];
    S0 -> S1 [ label = "/AS & DRAMAREA & CPUCLK & /RFSHCYC" ];
    S1 -> S2 ;
    S2 -> S3 [ label = "CPUCLK" ];
    S3 -> S4 ;
    S4 -> S5 ;
    S5 -> S0 ;
    S1 -> DRAMCYC [ label = "Start DRAM cyc" ];
    S5 -> DRAMCYC [ label = "End DRAM cyc" ];
    S1 -> nRAS [ label = "Assert nRAS" ];
    S4 -> nRAS [ label = "Negate nRAS" ];
    S3 -> nCAS [ label = "nCAS" ];
    S5 -> nCAS [ label = "nCAS" ];
    S2 -> DRAMPX [ label = "DRAMPX->COL"];
    S5 -> DRAMPX [ label = "DRAMPX->ROW"];
    S4 -> nDSACK [ label = "Assert DSACK"];
    S5 -> nDSACK [ label = "Negate DSACK"];

    RFSHシーケンス -> R0 [ label = "DRAM RFSH制御" ];
    R0 -> R1 [ label = "AS & REFCLK & /CPUCLK & /DRAMCYC" ];
    R1 -> R2 ;
    R2 -> R3 ;
    R3 -> R4 ;
    R4 -> R5 ;
    R5 -> R6 ;
    R6 -> R7 ;
    R7 -> R0 ;
    R2 -> nRAS_RFSH [ label = "Assert CBR RFSH nRAS" ];
    R6 -> nRAS_RFSH [ label = "Negate CBR RFSH nRAS" ];
    R1 -> nCAS_RFSH [ label = "Assert CBR RFSH nCAS" ];
    R5 -> nCAS_RFSH [ label = "Negate CBR RFSH nCAS" ];
    R1 -> RFSHCYC [ label = "Start RFSH cyc" ];
    R7 -> RFSHCYC [ label = "End RFSH cyc" ];
}