Introduction
Note: If you don't know what MVLSIM or TexSim is or are not interested in random access (indexed/striped) simulation dump formats, hit your back button now as this information will mean nothing to you.
This document details the internal file structure of the MVLSIM format AET. As information on this file format has not been released, its characteristics were determined through exhaustive examination and experimentation. As such, there is some incomplete information present (e.g., it is yet unknown how parallel instantiation AETs are represented and some bytes have unknown uses) and some information may be incorrect. This file is being provided such that converters may be written for architectures that the aetrdr.o AET reader API has not been ported to. Sample converters mvl2vcd and tex2vcd are provided for more "complete" documentation purposes. They seem to work fine with non-parallel instance models under Texsim-7.1.6. However, use at your own risk.
This contains information such as the date and time of model creation and simulation, the model name, the number of facilities in the model, facility geometries, etc. Note that all numeric variables stored are in PPC "big endian" format.
00000000: d0 00 00 00 00 06 00 02 00 00 00 b8 31 32 33 34 ............1234 00000010: f1 f2 f3 f4 30 35 2f 30 38 2f 30 31 31 34 3a 34 ....05/08/0114:4 00000020: 32 3a 30 35 3a f8 3d fd 00 00 00 00 00 00 12 e2 2:05:.=.........
00000000: d0 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- MVLSIM format AET 00000000: -- -- -- -- -- -- -- -- -- -- -- -- 31 32 33 34 ASCII vs 00000010: f1 f2 f3 f4 -- -- -- -- -- -- -- -- -- -- -- -- EBCDIC encoding 00000010: -- -- -- -- 30 35 2f 30 38 2f 30 31 31 34 3a 34 AET generation date 00000020: 32 3a 30 35 -- -- -- -- -- -- -- -- -- -- -- -- and time 00000020: -- -- -- -- -- -- -- -- -- -- -- -- 00 00 12 e2 Amt of var mem needed?
00000030: 00 00 00 00 00 00 00 00 00 00 34 00 00 01 00 00 ..........4.....
00000030: -- -- -- -- -- -- -- -- -- -- -- -- 00 01 00 00 FacIndx Trampoline = 65536 facs (TexSim only?)
00000040: 00 00 00 02 00 00 02 a9 00 00 b1 a3 00 00 00 00 ................ 00000050: 00 00 00 01 00 00 00 00 30 35 2f 30 38 2f 30 31 ........05/08/01 00000060: 31 34 3a 34 30 3a 32 34 64 65 73 00 00 00 00 00 14:40:24des.....
00000040: -- -- -- -- 00 00 02 a9 -- -- -- -- -- -- -- -- Number of facs in model 00000050: -- -- -- -- -- -- -- -- 30 35 2f 30 38 2f 30 31 Model creation date 00000060: 31 34 3a 34 30 3a 32 34 64 65 73 00 -- -- -- -- and C fmt model name
00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000b0: 30 00 00 00 80 00 84 00 00 00 00 00 00 00 00 00 0...............Unknown what 00000070-000000bf represent.
000000c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 a9 ................ 000000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000f0: 00 00 02 a9 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000c0: -- -- -- -- -- -- -- -- -- -- -- -- 00 00 02 a9 Number of facs 000000f0: 00 00 02 a9 -- -- -- -- -- -- -- -- -- -- -- -- in model
00000100: 00 00 00 00 00 01 00 01 01 00 00 00 00 00 12 e2 First fac geometry (#0) 00000110: 00 00 00 00 00 01 00 41 38 00 00 00 00 00 12 e2 Second fac geometry (#1) . . . 00002b80: 00 00 00 00 00 01 00 05 38 00 00 00 00 00 12 e2 This is last fac geometry (#2a8)
00000110: -- -- -- -- 00 01 -- -- -- -- -- -- -- -- -- -- Rows (> 1 is array) 00000110: -- -- -- -- -- -- 00 41 -- -- -- -- -- -- -- -- Columns (# bits = 65 for this fac) 00000110: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- -- MSB set if an MVL bus (*) 00000110: -- -- -- -- -- -- -- -- -- -- -- -- 00 00 12 e2 Amt of mem for facs?(*) Single bits seem to be 01, vectors 38. Note that you OR 0x80 with this if it's an MVL bus. In that case, 2 bits will represent each of four MVL values for encodings in the value change part of the AET.
00: 0
01: 1
10: X
11: H (aka 'Z' in verilog)
This contains delta compressed facility names. This seems to be alphabetically sorted in ascending order which is a handy way of efficiently encoding hierarchies--especially deep ones:
00002b90: 00 00 63 6c 6b 00 00 01 74 00 00 00 6b 31 30 78 ..clk...t...k10x 00002ba0: 00 00 02 31 78 00 00 02 32 78 00 00 02 33 78 00 ...1x...2x...3x. 00002bb0: 00 02 34 78 00 00 02 35 78 00 00 02 36 78 00 00 ..4x...5x...6x.. 00002bc0: 02 78 00 00 01 32 78 00 00 01 33 78 00 00 01 34 .x...2x...3x...4 00002bd0: 78 00 00 01 35 78 00 00 01 36 78 00 00 01 37 78 x...5x...6x...7x 00002be0: 00 00 01 38 78 00 00 01 39 78 00 00 01 65 79 00 ...8x...9x...ey. 00002bf0: 00 03 73 63 68 65 64 2e 63 30 78 00 00 0a 31 30 ..sched.c0x...10Encoding: Prefix copy length (2 bytes) + null terminated suffix. Assume first prefix name is "", hence the above represents:
00 00 "clk" 00 -> "" + "clk" = "clk" 00 01 "t" 00 -> "c" + "t" = "ct" 00 00 "k10x" 00 -> "" + "k10x" = "k10x" 00 02 "1x" 00 -> "k1" + "1x" = "k11x"and so forth...
Encoding is a command byte followed by relevant (if any) data. Note that the following "back references" exist:
2x -- -- -> 2 byte offset from start of file of prev change 4x -- -- -- -> 3 byte offset from start of file of prev change 6x -- -- -- -- -> 4 byte offset from start of file of prev changeThe previous change offset is used to find the preceeding value change for a given signal. The method for reading a signal's value changes is that you have to start at the END of the file and work your way backwards. This is the *only* way to correlate which value change goes with which facility! (The index for the final value change for each facility is encoded at the end of the file and will be explained below.) Thus, MVLSIM format AETs are "striped" in that you have to read one signal backwards at a time. In order to get around this limitation, you can place all your facilities in a priority queue and work your way backwards stepwise.
There are several commands and some have "overloaded" functions:
20 aa aa -> Set to '0' (only for single bit facilities) aa aa = previous value change offset 20 aa aa bb ... -> Super Value Change escape sequence bb ... = "super value change" column bytes. Currently, only "01XH" (corresponding to 0x00..0x03) are known. these ONLY apply if the facility column length > 1 bit 22 aa aa bb cc ... -> Array row encode aa aa = previous value change offset bb = row index (this is 2 bytes if your array has > 255 rows) cc ... = row data (1 bit per column for "regular", 2 bits per column for MVL fac) 24 aa aa bb ... -> Set to '1' aa aa = previous value change offset bb ... = column bits (1 bit per column for "regular", 2 bits per column for MVL fac) column bits are only specified when the facility column length > 1 bit. 28 aa aa -> Set to 'X' (with offset) 2c aa aa -> Set to 'H' (with offset)(*) Note that for 20, 24, 28, 2c, the 3 and 4 byte variants exist with nybble prefixes of 4 and 6 (i.e., for 40, 44, 48, 4c the aa aa field is aa aa aa, and for 60, 64, 68, 6c the aa aa field is aa aa aa aa). Additionally, it seems that sometimes the command byte has to be ANDed with 0x7f, but it is unknown when this applies.
a4 xx xx xx xx -> Explicit timechange a5 xx -> Increment time by xx ticks a6 -> Increment cycle time by one ac -> Flash all facilities to '0' ad -> Flash all facilities to '1' ae -> Flash all facilities to 'X' af -> Flash all facilities to 'H' b4 -> Stop parsing
As you can see, if you do not begin at the end of file, you will not know which value change corresponds with which facility:
00003e70: -- -- -- -- -- -- -- -- -- -- a4 00 00 00 00 ac 00003e80: a6 a6 a6 24 00 00 a6 24 00 00 24 00 00 24 00 00 00003e90: 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00003ea0: 00 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00003eb0: 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00 00003ec0: 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00003ed0: 00 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00003ee0: 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00 00003ef0: 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00003f00: 00 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00003f10: 00 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00 00003f20: 24 00 00 24 00 00 24 00 00 24 00 00 24 00 00 24Let's skip a bit...
000046f0: 36 24 00 00 6e 24 00 00 6e 24 00 00 72 20 3e 83 6$..n$..n$..r >. 00004700: 24 00 00 37 8b 78 b7 be fc 80 24 00 00 36 24 00 $..7.x....$..6$. 00004710: 00 62 24 00 00 36 24 00 00 62 24 00 00 36 24 00 .b$..6$..b$..6$. 00004720: 00 6e 24 00 00 6e 24 00 00 72 a6 20 3e 87 20 3e .n$..n$..r. >. > 00004730: 8a 20 3e 8d 20 3e 90 20 3e 93 20 3e 96 20 3e 99 . >. >. >. >. >.You can see backpointers in action at 46fd: 20 3e 83
The time table is concatenated onto the end of the value change data. The format for each entry is:
aa aa aa aa bb bb bb bbaa aa aa aa = Offset in file
00141ae0: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 00 00 00141af0: 3e 80 00 00 00 00 00 00 3e 81 00 00 00 01 00 00 00141b00: 3e 82 00 00 00 02 00 00 3e 83 00 00 00 03 00 00 00141b10: 3e 87 00 00 00 04 00 00 47 2b 00 00 00 05 00 00So...
If you look at the position of the a6 values earlier in the AET, you will see that this is indeed how the table is set up.
The last 23 bytes are very important as they give the offsets for several important data areas in the AET:
00146410: -- -- 00 00 0a a4 00 00 04 44 00 00 07 d0 b4 c5 00146420: 00 00 00 00 00 00 04 43 b4
00146410: -- -- 00 00 0a a4 -- -- -- -- -- -- -- -- -- -- Unknown, varies. 00146410: -- -- -- -- -- -- 00 00 04 44 -- -- -- -- -- -- Last cycle + 1. 00146410: -- -- -- -- -- -- -- -- -- -- 00 00 07 d0 -- -- 2000. Have seen 1000 here also..appears to be some internal size alloc value. 00146410: -- -- -- -- -- -- -- -- -- -- -- -- -- -- b4 -- End of section. 00146410: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- c5 Unknown. Sime kind of flag? 00146420: 00 00 00 00 -- -- -- -- -- First cycle. 00146420: -- -- -- -- 00 00 04 43 -- Last Cycle. 00146420: -- -- -- -- -- -- -- -- b4 Marks end of file--used for early truncation detection.The section before the 23 bytes of eplilogue is an in-order four byte per entry offset table that indicates where the LAST value change is for each facility in the AET. This is the key to being able to decode the value change section:
001463e0: 19 d6 00 13 a1 27 00 14 19 d2 00 13 a1 2c 00 14 001463f0: 19 ce 00 13 a2 2b 00 13 a2 30 00 13 a2 35 00 13 00146400: 98 a5 00 13 a2 3a 00 13 a2 3f 00 13 a2 44 00 13 00146410: a2 49 -- -- -- -- -- -- -- -- -- -- -- -- -- --Facility 02a8 final value change is at 0013a249
If a facility has no value change ever, it will have an offset of 00000000.
TexSim AETs are different in that they do not require timetables, they encode only single bits, and can be read from front to back. Some of the MVLSIM AET command bytes derive their heritage from TexSim AETs. Note that to extend the number of addressable facilities over 64k facs, "offsets" are used. The offset is a base address that a 2 byte value is added to to derive the "correct" fac number. In effect, offsets are used to trampoline greater than 64k. Another difference is that facility names are stored uncompressed. Here are the commands:
a4 xx xx xx xx Absolute time a5 xx Delta time a6 Increment time by one a7 Reset time to zero a8 xx xx xx xx Absolute offset a9 xx New offset += xx * multiplier (32-bit val @ 0x3c in AET) aa a9 but xx is implied to be 1 ab Reset offset to zero ac Flash all facs to '0' ad Flash all facs to '1' ae Flash all facs to 'X' af Flash all facs to 'H' b0 xx xx yy yy... Change the next xx xx facs in following list to '0' b1 xx xx yy yy... Change the next xx xx facs in following list to '1' b2 xx xx yy yy... Change the next xx xx facs in following list to 'X' b3 xx xx yy yy... Change the next xx xx facs in following list to 'H' b4 Stop tag b5 xx xx xx Explicitly change fac xx xx xx to '0' (no offset used) b6 xx xx xx Explicitly change fac xx xx xx to '1' (no offset used) b7 xx xx xx Explicitly change fac xx xx xx to 'X' (no offset used) b8 xx xx xx Explicitly change fac xx xx xx to 'H' (no offset used)