Skip to content
Snippets Groups Projects
Commit 4279cc05 authored by Pieter Donker's avatar Pieter Donker
Browse files

add config file

parent 3df4032a
Branches
No related tags found
No related merge requests found
Pipeline #50079 passed
#!/usr/bin/python3 #!/usr/bin/python3
# ##########################################################################
# Copyright 2020
# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ##########################################################################
# ##########################################################################
# Author: Pieter Donker
# Purpose: convert hdl code to fixed format
# Description:
# This script will handle one file.
# usage:
# vhdl_style_fix.py [filename]
#
# ##########################################################################
from os import getenv, path
import sys import sys
# from collections import OrderedDict
from argparse import ArgumentParser, RawTextHelpFormatter from argparse import ArgumentParser, RawTextHelpFormatter
from textwrap import dedent from textwrap import dedent
# from copy import copy from yaml import load, FullLoader
def main(): def main():
...@@ -12,41 +41,53 @@ def main(): ...@@ -12,41 +41,53 @@ def main():
sdata = data_in.splitlines() sdata = data_in.splitlines()
rts = RemoveTrailingSpaces(sdata) if cnf["space"]["remove-trailing"]:
sdata = rts.get_data() func = RemoveTrailingSpaces(sdata)
sdata = func.get_data()
asao = AddSpacesAroundOperators(sdata) if cnf["space"]["add-around-operators"]:
sdata = asao.get_data() func = AddSpacesAroundOperators(sdata)
sdata = func.get_data()
# asad = AddSpacesAroundDelimiters(sdata) if cnf["space"]["add-around-delimiters"]:
# sdata = asad.get_data() func = AddSpacesAroundDelimiters(sdata)
sdata = func.get_data()
csl = CaseStandardLogic(sdata) if cnf["case"]["standard-logic"]:
sdata = csl.get_data() func = CaseStandardLogic(sdata)
sdata = func.get_data()
cc = CaseConstants(sdata) if cnf["case"]["constants"]:
sdata = cc.get_data() func = CaseConstants(sdata)
sdata = func.get_data()
ck = CaseKeywords(sdata) if cnf["case"]["reserved-words"]:
sdata = ck.get_data() func = CaseReservedWords(sdata)
sdata = func.get_data()
ct = CaseTypes(sdata) if cnf["case"]["types"]:
sdata = ct.get_data() func = CaseTypes(sdata)
sdata = func.get_data()
cc = CaseConversions(sdata) if cnf["case"]["conversions"]:
sdata = cc.get_data() func = CaseConversions(sdata)
sdata = func.get_data()
cr = CaseResolutions(sdata) if cnf["case"]["resolutions"]:
sdata = cr.get_data() func = CaseResolutions(sdata)
sdata = func.get_data()
ca = CaseAttributes(sdata) if cnf["case"]["attributes"]:
sdata = ca.get_data() func = CaseAttributes(sdata)
sdata = func.get_data()
rsbb = RemoveSpaceBeforeBracket(sdata) if cnf["space"]["remove-before-bracket"]:
sdata = rsbb.get_data() func = RemoveSpaceBeforeBracket(sdata)
sdata = func.get_data()
# sdata = apa.get_data() if cnf["align"]["procedure-args"]:
# apa = AlignProcedureArgs(sdata) func = AlignProcedureArgs(sdata)
sdata = func.get_data()
data = '\n'.join(sdata) + "\n" data = '\n'.join(sdata) + "\n"
...@@ -60,6 +101,7 @@ def main(): ...@@ -60,6 +101,7 @@ def main():
class BaseCheck: class BaseCheck:
def __init__(self, data): def __init__(self, data):
self.splitchars = [] self.splitchars = []
self.tokens = None
self.data = data self.data = data
self.n_data = len(self.data) self.n_data = len(self.data)
...@@ -110,7 +152,7 @@ class RemoveTrailingSpaces(BaseCheck): ...@@ -110,7 +152,7 @@ class RemoveTrailingSpaces(BaseCheck):
class AddSpacesAroundOperators(BaseCheck): class AddSpacesAroundOperators(BaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data)
self.tokens = Operators() self.tokens = Tokens(cnf["tokens"]["operators"])
self.check() self.check()
def check(self): def check(self):
...@@ -218,7 +260,7 @@ class AddSpacesAroundOperators(BaseCheck): ...@@ -218,7 +260,7 @@ class AddSpacesAroundOperators(BaseCheck):
class AddSpacesAroundDelimiters(BaseCheck): class AddSpacesAroundDelimiters(BaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data)
self.tokens = Delimiters() self.tokens = Tokens(cnf["tokens"]["delimiters"])
self.check() self.check()
def check(self): def check(self):
...@@ -267,79 +309,65 @@ class AddSpacesAroundDelimiters(BaseCheck): ...@@ -267,79 +309,65 @@ class AddSpacesAroundDelimiters(BaseCheck):
self.data[i] = ''.join(new_line) self.data[i] = ''.join(new_line)
class CaseKeywords(BaseCheck): class CaseCheck(BaseCheck):
def __init__(self, data): def __init__(self, data, case, splitchars, tokens):
super().__init__(data) super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")"] self.case = str.lower if case == "lower" else str.upper
self.reserved_words = ReservedWords() self.splitchars = splitchars
self.check() self.tokens = Tokens(tokens)
def check(self): def check(self):
for i in range(self.n_data): for i in range(self.n_data):
line = self.data[i] line = self.data[i]
sline = self.splitline(line) sline = self.splitline(line)
for word in sline: for word in sline:
if self.reserved_words.is_valid(word): if self.tokens.is_valid(word):
line = line.replace(word, word.lower(), 1) line = line.replace(word, self.case(word), 1)
self.data[i] = line self.data[i] = line
class CaseTypes(BaseCheck): class CaseReservedWords(CaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data,
self.splitchars = [" ", ".", ";", "(", ")"] cnf["case"]["reserved-words"]["case"],
self.tokens = Types() cnf["case"]["reserved-words"]["splitchars"],
cnf["tokens"]["reserved-words"])
self.check() self.check()
def check(self):
for i in range(self.n_data):
line = self.data[i]
sline = self.splitline(line)
for word in sline:
if self.tokens.is_valid(word):
line = line.replace(word, word.lower(), 1)
self.data[i] = line
class CaseConversions(BaseCheck): class CaseTypes(CaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data,
self.splitchars = [" ", ".", ";", "(", ")"] cnf["case"]["types"]["case"],
self.tokens = Conversions() cnf["case"]["types"]["splitchars"],
cnf["tokens"]["types"])
self.check() self.check()
def check(self):
for i in range(self.n_data):
line = self.data[i]
sline = self.splitline(line)
for word in sline:
if self.tokens.is_valid(word):
line = line.replace(word, word.lower(), 1)
self.data[i] = line
class CaseResolutions(BaseCheck): class CaseConversions(CaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data,
self.splitchars = [" ", ".", ";", "(", ")"] cnf["case"]["conversions"]["case"],
self.tokens = Resolutions() cnf["case"]["conversions"]["splitchars"],
cnf["tokens"]["conversions"])
self.check() self.check()
def check(self):
for i in range(self.n_data): class CaseResolutions(CaseCheck):
line = self.data[i] def __init__(self, data):
sline = self.splitline(line) super().__init__(data,
for word in sline: cnf["case"]["resolutions"]["case"],
if self.tokens.is_valid(word): cnf["case"]["resolutions"]["splitchars"],
line = line.replace(word, word.lower(), 1) cnf["tokens"]["resolutions"])
self.data[i] = line self.check()
class CaseAttributes(BaseCheck): class CaseAttributes(CaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data,
self.splitchars = [" ", ".", ";", "(", ")", "'"] cnf["case"]["resolutions"]["case"],
self.tokens = Attributes() cnf["case"]["resolutions"]["splitchars"],
cnf["tokens"]["attributes"])
self.check() self.check()
def check(self): def check(self):
...@@ -354,51 +382,33 @@ class CaseAttributes(BaseCheck): ...@@ -354,51 +382,33 @@ class CaseAttributes(BaseCheck):
self.data[i] = line self.data[i] = line
class CaseConstants(BaseCheck): class CaseConstants(CaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data,
self.splitchars = [" ", ".", ";", "(", ")", ","] cnf["case"]["constants"]["case"],
self.tokens = Constants() cnf["case"]["constants"]["splitchars"],
cnf["tokens"]["constants"])
self.check() self.check()
def check(self):
for i in range(self.n_data):
line = self.data[i]
sline = self.splitline(line)
for j in range(len(sline)):
word = sline[j]
if self.tokens.is_valid(word):
line = line.replace(word, word.lower(), 1)
self.data[i] = line
class CaseStandardLogic(BaseCheck): class CaseStandardLogic(CaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data,
self.splitchars = [" ", ".", ";", "(", ")", ","] cnf["case"]["standard-logic"]["case"],
self.tokens = StandardLogic() cnf["case"]["standard-logic"]["splitchars"],
cnf["tokens"]["standard-logic"])
self.check() self.check()
def check(self):
for i in range(self.n_data):
line = self.data[i]
sline = self.splitline(line)
for j in range(len(sline)):
word = sline[j]
if self.tokens.is_valid(word):
line = line.replace(word, word.lower(), 1)
self.data[i] = line
class RemoveSpaceBeforeBracket(BaseCheck): class RemoveSpaceBeforeBracket(BaseCheck):
def __init__(self, data): def __init__(self, data):
super().__init__(data) super().__init__(data)
self.types = Types() self.tokens = Tokens(cnf["tokens"]["types"])
self.check() self.check()
def check(self): def check(self):
for i in range(self.n_data): for i in range(self.n_data):
for t in self.types.tokens(): for t in self.tokens.all():
self.data[i] = self.data[i].replace(f"{t} (", f"{t}(") self.data[i] = self.data[i].replace(f"{t} (", f"{t}(")
...@@ -454,14 +464,14 @@ class AlignProcedureArgs(BaseCheck): ...@@ -454,14 +464,14 @@ class AlignProcedureArgs(BaseCheck):
proc_span = [0, 0] proc_span = [0, 0]
class Token: class Tokens:
""" """
Base class for tokens Class for tokens
""" """
def __init__(self, tokens): def __init__(self, tokens):
self._tokens = tokens self._tokens = tokens
def tokens(self): def all(self):
return self._tokens return self._tokens
def is_valid(self, val): def is_valid(self, val):
...@@ -470,72 +480,11 @@ class Token: ...@@ -470,72 +480,11 @@ class Token:
return False return False
class Types(Token):
def __init__(self):
super().__init__(["bit", "bit_vector", "integer", "natural", "positive", "boolean", "string",
"character", "real", "time", "delay_length",
"std_ulogic", "std_ulogic_vector", "std_logic", "std_logic_vector"])
class Conversions(Token):
def __init__(self):
super().__init__(["signed", "unsigned", "to_signed", "to_unsigned", "to_integer", "to_uint", "to_sint",
"to_ureal", "to_sreal", "to_uvec", "to_svec"])
class Resolutions(Token):
def __init__(self):
super().__init__(["'u'", "'x'", "'0'", "'1'", "'z'", "'w'", "'l'", "'h'", "'-'"])
class Constants(Token):
def __init__(self):
super().__init__(["true", "false"])
class StandardLogic(Token):
def __init__(self):
super().__init__(["ieee", "std_logic_1164", "numeric_std", "math_real", "std_logic_textio", "resize"])
class Attributes(Token):
def __init__(self):
super().__init__(["base", "left", "right", "high", "low", "ascending", "image", "value", "pos", "val", "succ",
"pred", "leftof", "rightof", "left", "left", "right", "right", "high", "high", "low", "low",
"range", "range", "reverse_range", "reverse_range", "length", "length", "ascending",
"ascending", "delayed", "stable", "stable", "quiet", "quiet", "transaction", "event",
"active", "last_event", "last_active", "last_value", "driving", "driving_value",
"simple_name", "instance_name", "path_name"])
class Operators(Token):
def __init__(self):
super().__init__(["*", "/", "+", "-", "&", "=", "<", ">", ":"])
class Delimiters(Token):
def __init__(self):
super().__init__([":"])
class ReservedWords(Token):
def __init__(self):
super().__init__(["abs", "access", "after", "alias", "all", "and", "architecture",
"array", "assert", "attribute", "begin", "block", "body", "buffer",
"bus", "case", "component", "configuration", "constant", "disconnect",
"downto", "else", "elsif", "end", "entity", "exit", "file", "for",
"function", "generate", "generic", "group", "guarded", "if", "impure",
"in", "inertial", "inout", "is", "label", "library", "linkage", "literal",
"loop", "map", "mod", "nand", "new", "next", "nor", "not", "null", "of",
"on", "open", "or", "others", "out", "package", "port", "postponed",
"procedure", "process", "pure", "range", "record", "register", "reject",
"rem", "report", "return", "rol", "ror", "select", "severity", "signal",
"shared", "sla", "sll", "sra", "srl", "subtype", "then", "to", "transport",
"type", "unaffected", "units", "until", "use", "variable", "wait", "when",
"while", "with", "xnor", "xor"])
if __name__ == "__main__": if __name__ == "__main__":
# load config file
basedir = getenv("HDL_WORK")
config_file = path.join(basedir, "tools", "vhdl_style_fix.yaml")
cnf = load(open(config_file, 'r'), Loader=FullLoader)
# Parse command line arguments # Parse command line arguments
parser = ArgumentParser( parser = ArgumentParser(
description="".join(dedent("""\ description="".join(dedent("""\
......
#
# config file for vhdl_style_fix.py
#
space:
remove-trailing: True
add-around-operators: True
add-around-delimiters: False
remove-before-bracket: True
indend:
apply: False
size: 2
align:
procedure-args: False
case:
standard-logic:
convert: True
case: "lower"
splitchars: [" ", ".", ";", "(", ")", ","]
constants:
convert: True
case: "lower"
splitchars: [" ", ".", ";", "(", ")", ","]
reserved-words:
convert: True
case: "lower"
splitchars: [" ", ".", ";", "(", ")"]
types:
convert: True
case: "lower"
splitchars: [" ", ".", ";", "(", ")"]
conversions:
convert: True
case: "lower"
splitchars: [" ", ".", ";", "(", ")"]
resolutions:
convert: True
case: "lower"
splitchars: [" ", ".", ";", "(", ")"]
attributes:
convert: True
case: "lower"
splitchars: [" ", ".", ";", "(", ")", "'"]
# all tokens used
tokens:
types:
- "bit"
- "bit_vector"
- "integer"
- "natural"
- "positive"
- "boolean"
- "string"
- "character"
- "real"
- "time"
- "delay_length"
- "std_ulogic"
- "std_ulogic_vector"
- "std_logic"
- "std_logic_vector"
conversions:
- "signed"
- "unsigned"
- "to_signed"
- "to_unsigned"
- "to_integer"
- "to_uint"
- "to_sint"
- "to_ureal"
- "to_sreal"
- "to_uvec"
- "to_svec"
resolutions:
- "'u'"
- "'x'"
- "'0'"
- "'1'"
- "'z'"
- "'w'"
- "'l'"
- "'h'"
- "'-'"
constants:
- "true"
- "false"
standard-logic:
- "ieee"
- "std_logic_1164"
- "numeric_std"
- "math_real"
- "std_logic_textio"
- "resize"
operators:
- "*"
- "/"
- "+"
- "-"
- "&"
- "="
- "<"
- ">"
- ":"
delimiters:
- ":"
attributes:
- "base"
- "left"
- "right"
- "high"
- "low"
- "ascending"
- "image"
- "value"
- "pos"
- "val"
- "succ"
- "pred"
- "leftof"
- "rightof"
- "range"
- "reverse_range"
- "length"
- "ascending"
- "delayed"
- "stable"
- "quiet"
- "transaction"
- "event"
- "active"
- "last_event"
- "last_active"
- "last_value"
- "driving"
- "driving_value"
- "simple_name"
- "instance_name"
- "path_name"
reserved-words:
- "abs"
- "access"
- "after"
- "alias"
- "all"
- "and"
- "architecture"
- "array"
- "assert"
- "attribute"
- "begin"
- "block"
- "body"
- "buffer"
- "bus"
- "case"
- "component"
- "configuration"
- "constant"
- "disconnect"
- "downto"
- "else"
- "elsif"
- "end"
- "entity"
- "exit"
- "file"
- "for"
- "function"
- "generate"
- "generic"
- "group"
- "guarded"
- "if"
- "impure"
- "in"
- "inertial"
- "inout"
- "is"
- "label"
- "library"
- "linkage"
- "literal"
- "loop"
- "map"
- "mod"
- "nand"
- "new"
- "next"
- "nor"
- "not"
- "null"
- "of"
- "on"
- "open"
- "or"
- "others"
- "out"
- "package"
- "port"
- "postponed"
- "procedure"
- "process"
- "pure"
- "range"
- "record"
- "register"
- "reject"
- "rem"
- "report"
- "return"
- "rol"
- "ror"
- "select"
- "severity"
- "signal"
- "shared"
- "sla"
- "sll"
- "sra"
- "srl"
- "subtype"
- "then"
- "to"
- "transport"
- "type"
- "unaffected"
- "units"
- "until"
- "use"
- "variable"
- "wait"
- "when"
- "while"
- "with"
- "xnor"
- "xor"
\ No newline at end of file
#!/usr/bin/python3 #!/usr/bin/python3
from os import getenv # ##########################################################################
# Copyright 2020
# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ##########################################################################
# ##########################################################################
# Author: Pieter Donker
# Purpose: run vhdl_style_fix.py on all files in the hdl dir using multiple
# workers
# Description:
# -p: number of workers to use
# -v: verbose
# usage:
# cd git/hdl/
# . ./init_hdl.sh
# vhdl_style_fix_all_files.py -p 4
#
# ##########################################################################
from os import getenv, path
from sys import exit, version_info from sys import exit, version_info
from time import sleep from time import sleep
from argparse import ArgumentParser, RawTextHelpFormatter from argparse import ArgumentParser, RawTextHelpFormatter
...@@ -71,7 +103,9 @@ class Worker(Process): ...@@ -71,7 +103,9 @@ class Worker(Process):
""" """
Use vhdl_style_fix.py to fix the file Use vhdl_style_fix.py to fix the file
""" """
cmd = f"/home/donker/git/hdl/vhdl_style_fix.py {filename}" basedir = getenv("HDL_WORK")
fixtool = path.join(basedir, "tools", "vhdl_style_fix.py")
cmd = f"{fixtool} {filename}"
if self.verbose: if self.verbose:
cmd += " --verbose" cmd += " --verbose"
response = run_cmd(cmd) response = run_cmd(cmd)
...@@ -84,7 +118,7 @@ class Worker(Process): ...@@ -84,7 +118,7 @@ class Worker(Process):
control = self.control.get() control = self.control.get()
if control == "stop": if control == "stop":
self.stop = True self.stop = True
print(f"stop vsg worker {self.id}") print(f"stop worker {self.id}")
# get next vhd file to process # get next vhd file to process
filename = self.in_data.get(block=False) filename = self.in_data.get(block=False)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment