Skip to content
Snippets Groups Projects
Commit 21588897 authored by Pepping's avatar Pepping
Browse files

Replaced by vhdl.py

parent bdb7ce2f
No related branches found
No related tags found
No related merge requests found
###############################################################################
#
# Copyright (C) 2014
# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
"""
"""
import common as cm
import common_dict_file
import sys
import os
import os.path
import shutil
dirList = ["IN", "in", "OUT", "out", "INOUT", "inout"]
class Port:
def __init__(self, name, dir, type, default=""):
self.name = name
if dir in dirList:
self.dir = dir
else:
print """Not a valid dir type. Should be "IN", "OUT" or "INOUT" """
self.type = type
self.default = default
def setPortDir(self, newDir):
self.dir = newDir
class Generic:
def __init__(self, name, type, default=""):
self.name = name
self.type = type
self.default = default
class Constant:
def __init__(self, name, type, value=""):
self.name = name
self.type = type
self.value = value
class Signl:
def __init__(self, name, type, default=""):
self.name = name
self.type = type
self.default = default
class Entity:
s_port_start = " PORT (\n"
s_port_map_start = " PORT MAP(\n"
s_generic_start = " GENERIC (\n"
s_generic_map_start = " GENERIC MAP(\n"
def __init__(self, name = ""):
"""
"""
self.name = name
self.generics = []
self.ports = []
self.portNames = []
self.longestPortName = 15
self.longestPortDir = 3
self.genericNames = []
self.genericTypes = []
self.longestGenericName = 15
self.longestGenericType = 8
self.architecture = []
def read_entity_from_file(self, path, name):
fname = path + name + ".vhd"
if not(os.path.isfile(fname)): sys.exit('Error : Specified VHD file does not exist: ' + fname)
f = file(fname, "r")
s = ""
s = f.readline()
# Read the entity name
while not(('ENTITY ' in s) or ('entity ' in s)):
s = f.readline()
self.name = s.split(" ")[1]
s = f.readline()
# Find the start of the generic definitions
if('generic' in s) or ('GENERIC' in s):
while not(');') in s:
s = f.readline()
if not(self.comment_or_empty(s)):
if ');' in s:
s = f.readline()
break
s = self.remove_added_comment(s)
s_comp = s.split(": ")
newGenericName = s_comp[0].strip()
# Check if a default value is assigned
if(":=" in s_comp[1]):
s_comp1 = s_comp[1].split(":=")
newGenericDefault = (s_comp1[1].strip(";")).strip()
s_type = s_comp1[0]
else:
newGenericDefault = ""
s_type = s_comp[1]
newGenericType = (s_type.strip(";")).strip()
newGeneric = Generic(newGenericName, newGenericType, newGenericDefault)
self.generics.append(newGeneric)
if('port' in s) or ('PORT' in s):
while not('end entity ') in s:
s = f.readline()
if not(self.comment_or_empty(s)):
if s.strip() == ');':
break
s = self.remove_added_comment(s)
s_comp = s.split(": ")
newPortName = s_comp[0].strip()
# Check if a default value is assigned
if(":=" in s_comp[1]):
s_comp1 = s_comp[1].split(":=")
newPortDefault = (s_comp1[1].strip(";")).strip()
s_dir_type = s_comp1[0]
else:
newPortDefault = ""
s_dir_type = s_comp[1]
newPortDir = s_dir_type.split(" ", 1)[0]
newPortType = ((s_dir_type.split(" ", 1)[1]).strip(";")).strip()
self.add_port(newPortName, newPortDir, newPortType, newPortDefault)
f.close()
def comment_or_empty(self, s):
s_strip = s.strip()
return (s_strip.startswith("--") or not(s.strip()))
def remove_added_comment(self, s):
i = s.find('--')
if i != -1:
s = s[0:i] + "\n"
return s.strip()
def make_instantiation(self, connect=True):
if self.generics:
self.set_longest_generic_name()
self.set_longest_generic_type()
if self.ports:
self.set_longest_port_name()
self.set_longest_port_dir()
# Create start
s_return = "u_inst_" + self.name + " : ENTITY work." + self.name + "\n"
for i in range(len(self.generics)):
if(i == 0):
s_return = s_return + self.s_generic_map_start
s_generic = " " + self.generics[i].name.ljust(self.longestGenericName) + " => "
if(connect):
s_generic = s_generic + self.generics[i].name
if(i != len(self.generics)-1):
s_generic = s_generic + ",\n"
else:
s_generic = s_generic + "\n )\n"
s_return = s_return + s_generic
for i in range(len(self.ports)):
if(i == 0):
s_return = s_return + self.s_port_map_start
s_port = " " + self.ports[i].name.ljust(self.longestPortName) + " => "
if(connect):
s_port = s_port + self.ports[i].name
if(i != len(self.ports)-1):
s_port = s_port + ",\n"
else:
s_port = s_port + "\n );\n"
s_return = s_return + s_port
return s_return
def make_definition(self, inst_type="ENTITY"):
if self.generics:
self.set_longest_generic_name()
self.set_longest_generic_type()
if self.ports:
self.set_longest_port_name()
self.set_longest_port_dir()
# Create start
s_return = inst_type + " " + self.name +" IS\n"
for i in range(len(self.generics)):
if(i == 0):
s_return = s_return + self.s_generic_start
s_generic = " " + self.generics[i].name.ljust(self.longestGenericName) + " : " + self.generics[i].type.ljust(self.longestGenericType)
if(self.generics[i].default != ""):
s_generic = s_generic + " := " + self.generics[i].default
if(i != len(self.generics)-1):
s_generic = s_generic + ";\n"
else:
s_generic = s_generic + "\n );\n"
s_return = s_return + s_generic
for i in range(len(self.ports)):
if(i == 0):
s_return = s_return + self.s_port_start
s_port = " " + self.ports[i].name.ljust(self.longestPortName) + " : " + self.ports[i].dir.ljust(self.longestPortDir) + " " + self.ports[i].type
if(self.ports[i].default != ""):
s_port = s_port + " := " + self.ports[i].default
if(i != len(self.ports)-1):
s_port = s_port + ";\n"
else:
s_port = s_port + "\n );\n"
s_return = s_return + s_port
s_return = s_return + "END " + inst_type + " " + self.name + ";\n\n"
return s_return
def make_entity_definition(self, indend = 0):
return self.apply_indend(self.make_definition("ENTITY"), indend)
def make_component_definition(self, indend = 0):
return self.apply_indend(self.make_definition("COMPONENT"), indend)
def apply_indend(self, s, indend):
s_indend = ""
for i in range(indend):
s_indend = s_indend + " "
s_return =s_indend + s.replace('\n', '\n' + s_indend)
return (s_return)
def comment(self, s):
s_return ="-- " + s.replace('\n', '\n' + "-- ") + '\n'
return (s_return)
def set_longest_port_name(self):
self.portNames = []
for i in range(len(self.ports)):
self.portNames.append(self.ports[i].name)
self.longestPortName = len(max(self.portNames, key=len))
def set_longest_port_dir(self):
self.longestPortDir = 0
for i in range(len(self.ports)):
if(len(self.ports[i].dir) > self.longestPortDir):
self.longestPortDir = len(self.ports[i].dir)
def set_longest_generic_name(self):
self.genericNames = []
for i in range(len(self.generics)):
self.genericNames.append(self.generics[i].name)
self.longestGenericName = len(max(self.genericNames, key=len))
def set_longest_generic_type(self):
self.genericTypes = []
for i in range(len(self.generics)):
self.genericTypes.append(self.generics[i].type)
self.longestGenericType = len(max(self.genericTypes, key=len))
def add_port(self, name, dir, type, default = ""):
newPort = Port(name, dir, type, default)
self.ports.append(newPort)
def add_generic(self, name, type, default = ""):
newGeneric = Generic(name, type, default)
self.generics.append(newGeneric)
def replace_std_logic_vector_with_std_logic(self):
for i in self.ports:
if i.type == "std_logic_vector(0 downto 0)":
i.type = "std_logic"
elif i.type == "STD_LOGIC_VECTOR(0 DOWNTO 0)":
i.type = "STD_LOGIC"
class Architecture:
def __init__(self, name = ""):
"""
"""
self.name = name
self.constants = []
self.signals = []
self.components = []
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment