Files
2013-04-16 12:16:43 +00:00

83 lines
2.9 KiB
Tcl

###############################################################################
# mem2mif.tcl 10-Sep-2010
# $1 The first paramter is the filename to be used for input and output
# The names of the input MEM file and the output MIF file:
puts "MEM input file name = [set mem_file "$1.mem"]"
puts "MIF output file name = [set mif_file "$1.mif"]"
# The amount of bits in a word:
puts "MIF file word length = [set wordlength 32] bits"
###############################################################################
set addr_ptr 0
if {[file exists $mem_file]} {
set mem_fileptr [open $mem_file]
set mif_fileptr [open $mif_file w]
set lineCount 0
while {[gets $mem_fileptr line] >= 0} {
set lineElements [llength $line]
# Skip empty and comment lines (preceeded by "//")
if { $lineElements != 0 && [lindex $line 0] != "//"} {
set byte_ptr 0
set mifline ""
for {set x 0} {$x < $lineElements} {incr x} {
set lineElem [lindex $line $x]
# Addresses are preceeded with a "@" character
if { [string index $lineElem 0] == "@"} {
set addr [scan $lineElem "@%x"]
# If the MIF file address pointer did not yet reach the addresses value
# in the MEM file yhen fill the MIF file with "0" until the MIF file
# address pointer is lined up.
while {$addr_ptr < $addr} {
set mifline ""
for {set bit_ptr 0} {$bit_ptr < $wordlength} {incr bit_ptr} {
append mifline "0"
}
puts $mif_fileptr $mifline
set addr_ptr [expr ($addr_ptr + int($wordlength/8))]
}
} else {
# Scan a byte from the MEM file
scan $lineElem "%x" dat
set byte_in_bits ""
# Calculate the individial bits that make up the byte
for {set bit_ptr 0} {$bit_ptr < 8} {incr bit_ptr} {
set bitval [expr ($dat - 2* int($dat/2))]
set dat [expr (int($dat/2))]
# Left append the bits just calculated
set byte_in_bits [append bitval $byte_in_bits]
}
append mifline $byte_in_bits
incr byte_ptr
# Check wether all bytes are read to write out a full MIF line
if {$byte_ptr == [expr (int($wordlength/8))]} {
puts $mif_fileptr $mifline
set addr_ptr [expr ($addr_ptr + int($wordlength/8))]
set byte_ptr 0
set mifline ""
}
}
}
# Check wether there are bytes read but the last word is not yet complete
# and the left-over bytes should be padded with eight "0" bits
if {$byte_ptr != 0} {
for {set padding $byte_ptr} {$padding < [expr (int($wordlength/8))]} {incr padding} {
append mifline "00000000"
}
puts $mif_fileptr $mifline
set addr_ptr [expr ($addr_ptr + int($wordlength/8))]
}
}
}
close $mem_fileptr
close $mif_fileptr
} else {
puts "WARNING $mem_file not found..."
}
###############################################################################