Bạn có thể chơi với một cái gì đó với graphviz và dấu chấm. Đó là những công cụ doxygen sử dụng để tạo sơ đồ. Nó không chính xác như những gì bạn đang tìm kiếm, nhưng nó rất nhanh và dễ dàng để kịch bản và đầu ra trông khá đẹp mắt (thậm chí bạn hơi khó theo dõi một số dòng ...)
Ví dụ này sẽ tạo ra một cái gì đó như thế này
Để làm điều này, trước tiên bạn tạo một tệp có tên byte.dot
digraph structs {
node [shape=plaintext]
struct1 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" ALIGN="left">
<TR>
<TD>0xc9</TD>
<TD PORT="f0"> 1 </TD>
<TD PORT="f1"> 1 </TD>
<TD PORT="f2"> 0 </TD>
<TD PORT="f3"> 0 </TD>
<TD PORT="f4"> 1 </TD>
<TD PORT="f5"> 0 </TD>
<TD PORT="f6"> 0 </TD>
<TD PORT="f7"> 1 </TD>
</TR>
</TABLE>>];
struct2 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" >
<TR> <TD ALIGN="left" PORT="f0"> RSTDISBL (reset pin is enabled) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f1"> WDTON (WDT not always on) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f2"> SPIEN (allow serial programming) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f3"> CKOPT (full output swing) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f4"> EESAVE (don't preserve EEPROM over chip erase) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f5"> BOOTSZ1 </TD> </TR>
<TR> <TD ALIGN="left" PORT="f6"> BOOTSZ0 </TD> </TR>
<TR> <TD ALIGN="left" PORT="f7"> BOOTRST (boot reset vector at 0x0000) </TD> </TR>
</TABLE>>];
struct1:f0:s -> struct2:f0:w;
struct1:f1:s -> struct2:f1:w;
struct1:f2:s -> struct2:f2:w;
struct1:f3:s -> struct2:f3:w;
struct1:f4:s -> struct2:f4:w;
struct1:f5:s -> struct2:f5:w;
struct1:f6:s -> struct2:f6:w;
struct1:f7:s -> struct2:f7:w;
}
Sau đó chạy một trong những lệnh đó.
dot -Tpng byte.dot -o byte.png
dot -Tps byte.dot -o byte.ps
Có lẽ nó sẽ đẹp hơn nếu chúng ta không vượt qua tất cả các dòng ở giữa?
Tôi vừa chuyển tên được đặt trong bảng thứ hai từ f0..f7 sang f7..f0.
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" >
<TR> <TD ALIGN="left" PORT="f7"> RSTDISBL (reset pin is enabled) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f6"> WDTON (WDT not always on) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f5"> SPIEN (allow serial programming) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f4"> CKOPT (full output swing) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f3"> EESAVE (don't preserve EEPROM over chip erase) </TD> </TR>
<TR> <TD ALIGN="left" PORT="f2"> BOOTSZ1 </TD> </TR>
<TR> <TD ALIGN="left" PORT="f1"> BOOTSZ0 </TD> </TR>
<TR> <TD ALIGN="left" PORT="f0"> BOOTRST (boot reset vector at 0x0000) </TD> </TR>
</TABLE>>];