#!/usr/bin/env python
|
#!/usr/bin/env python
|
"""A C to Verilog compiler"""
|
"""A C to Verilog compiler"""
|
|
|
__author__ = "Jon Dawson"
|
__author__ = "Jon Dawson"
|
__copyright__ = "Copyright (C) 2013, Jonathan P Dawson"
|
__copyright__ = "Copyright (C) 2013, Jonathan P Dawson"
|
__version__ = "0.1"
|
__version__ = "0.1"
|
|
|
import sys
|
import sys
|
import os
|
import os
|
|
|
from chips.compiler.parser import Parser
|
from chips.compiler.parser import Parser
|
from chips.compiler.exceptions import C2CHIPError
|
from chips.compiler.exceptions import C2CHIPError
|
from chips.compiler.optimizer import parallelise
|
from chips.compiler.optimizer import parallelise
|
from chips.compiler.optimizer import cleanup_functions
|
from chips.compiler.optimizer import cleanup_functions
|
from chips.compiler.optimizer import cleanup_registers
|
from chips.compiler.optimizer import cleanup_registers
|
from chips.compiler.tokens import Tokens
|
from chips.compiler.tokens import Tokens
|
from chips.compiler.verilog_speed import generate_CHIP as generate_CHIP_speed
|
from chips.compiler.verilog_speed import generate_CHIP as generate_CHIP_speed
|
from chips.compiler.verilog_area import generate_CHIP as generate_CHIP_area
|
from chips.compiler.verilog_area import generate_CHIP as generate_CHIP_area
|
|
|
def comp(input_file, options=[]):
|
def comp(input_file, options=[]):
|
|
|
reuse = "no_reuse" not in options
|
reuse = "no_reuse" not in options
|
initialize_memory = "no_initialize_memory" not in options
|
initialize_memory = "no_initialize_memory" not in options
|
|
|
try:
|
try:
|
if "speed" not in options:
|
if "speed" not in options:
|
|
|
#Optimize for area
|
#Optimize for area
|
parser = Parser(input_file, reuse, initialize_memory)
|
parser = Parser(input_file, reuse, initialize_memory)
|
process = parser.parse_process()
|
process = parser.parse_process()
|
name = process.main.name
|
name = process.main.name
|
instructions = process.generate()
|
instructions = process.generate()
|
instructions = cleanup_functions(instructions)
|
instructions = cleanup_functions(instructions)
|
instructions, registers = cleanup_registers(instructions, parser.allocator.all_registers)
|
instructions, registers = cleanup_registers(instructions, parser.allocator.all_registers)
|
output_file = name + ".v"
|
output_file = name + ".v"
|
output_file = open(output_file, "w")
|
output_file = open(output_file, "w")
|
inputs, outputs = generate_CHIP_area(
|
inputs, outputs = generate_CHIP_area(
|
input_file,
|
input_file,
|
name,
|
name,
|
instructions,
|
instructions,
|
output_file,
|
output_file,
|
registers,
|
registers,
|
parser.allocator.memory_size_2,
|
parser.allocator.memory_size_2,
|
parser.allocator.memory_size_4,
|
parser.allocator.memory_size_4,
|
initialize_memory,
|
initialize_memory,
|
parser.allocator.memory_content_2,
|
parser.allocator.memory_content_2,
|
parser.allocator.memory_content_4)
|
parser.allocator.memory_content_4)
|
output_file.close()
|
output_file.close()
|
|
|
else:
|
else:
|
|
|
#Optimize for speed
|
#Optimize for speed
|
parser = Parser(input_file, reuse, initialize_memory)
|
parser = Parser(input_file, reuse, initialize_memory)
|
process = parser.parse_process()
|
process = parser.parse_process()
|
name = process.main.name
|
name = process.main.name
|
instructions = process.generate()
|
instructions = process.generate()
|
instructions = cleanup_functions(instructions)
|
instructions = cleanup_functions(instructions)
|
instructions, registers = cleanup_registers(instructions, parser.allocator.all_registers)
|
instructions, registers = cleanup_registers(instructions, parser.allocator.all_registers)
|
if "no_concurrent" in sys.argv:
|
if "no_concurrent" in sys.argv:
|
frames = [[i] for i in instructions]
|
frames = [[i] for i in instructions]
|
else:
|
else:
|
frames = parallelise(instructions)
|
frames = parallelise(instructions)
|
output_file = name + ".v"
|
output_file = name + ".v"
|
output_file = open(output_file, "w")
|
output_file = open(output_file, "w")
|
inputs, outputs = generate_CHIP_speed(
|
inputs, outputs = generate_CHIP_speed(
|
input_file,
|
input_file,
|
name,
|
name,
|
frames,
|
frames,
|
output_file,
|
output_file,
|
registers,
|
registers,
|
parser.allocator.memory_size_2,
|
parser.allocator.memory_size_2,
|
parser.allocator.memory_size_4,
|
parser.allocator.memory_size_4,
|
initialize_memory,
|
initialize_memory,
|
parser.allocator.memory_content_2,
|
parser.allocator.memory_content_2,
|
parser.allocator.memory_content_4)
|
parser.allocator.memory_content_4)
|
output_file.close()
|
output_file.close()
|
|
|
except C2CHIPError as err:
|
except C2CHIPError as err:
|
print "Error in file:", err.filename, "at line:", err.lineno
|
print "Error in file:", err.filename, "at line:", err.lineno
|
print err.message
|
print err.message
|
sys.exit(-1)
|
sys.exit(-1)
|
|
|
|
|
return name, inputs, outputs, ""
|
return name, inputs, outputs, ""
|
|
|