You've already forked gitified_old_clb_svn
83 lines
2.9 KiB
Tcl
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..."
|
|
}
|
|
|
|
###############################################################################
|
|
|