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
# ##########################################################################
# 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
# from collections import OrderedDict
from argparse import ArgumentParser, RawTextHelpFormatter
from textwrap import dedent
# from copy import copy
from yaml import load, FullLoader
def main():
......@@ -12,41 +41,53 @@ def main():
sdata = data_in.splitlines()
rts = RemoveTrailingSpaces(sdata)
sdata = rts.get_data()
if cnf["space"]["remove-trailing"]:
func = RemoveTrailingSpaces(sdata)
sdata = func.get_data()
asao = AddSpacesAroundOperators(sdata)
sdata = asao.get_data()
if cnf["space"]["add-around-operators"]:
func = AddSpacesAroundOperators(sdata)
sdata = func.get_data()
# asad = AddSpacesAroundDelimiters(sdata)
# sdata = asad.get_data()
if cnf["space"]["add-around-delimiters"]:
func = AddSpacesAroundDelimiters(sdata)
sdata = func.get_data()
csl = CaseStandardLogic(sdata)
sdata = csl.get_data()
if cnf["case"]["standard-logic"]:
func = CaseStandardLogic(sdata)
sdata = func.get_data()
cc = CaseConstants(sdata)
sdata = cc.get_data()
if cnf["case"]["constants"]:
func = CaseConstants(sdata)
sdata = func.get_data()
ck = CaseKeywords(sdata)
sdata = ck.get_data()
if cnf["case"]["reserved-words"]:
func = CaseReservedWords(sdata)
sdata = func.get_data()
ct = CaseTypes(sdata)
sdata = ct.get_data()
if cnf["case"]["types"]:
func = CaseTypes(sdata)
sdata = func.get_data()
cc = CaseConversions(sdata)
sdata = cc.get_data()
if cnf["case"]["conversions"]:
func = CaseConversions(sdata)
sdata = func.get_data()
cr = CaseResolutions(sdata)
sdata = cr.get_data()
if cnf["case"]["resolutions"]:
func = CaseResolutions(sdata)
sdata = func.get_data()
ca = CaseAttributes(sdata)
sdata = ca.get_data()
if cnf["case"]["attributes"]:
func = CaseAttributes(sdata)
sdata = func.get_data()
rsbb = RemoveSpaceBeforeBracket(sdata)
sdata = rsbb.get_data()
if cnf["space"]["remove-before-bracket"]:
func = RemoveSpaceBeforeBracket(sdata)
sdata = func.get_data()
# sdata = apa.get_data()
# apa = AlignProcedureArgs(sdata)
if cnf["align"]["procedure-args"]:
func = AlignProcedureArgs(sdata)
sdata = func.get_data()
data = '\n'.join(sdata) + "\n"
......@@ -60,6 +101,7 @@ def main():
class BaseCheck:
def __init__(self, data):
self.splitchars = []
self.tokens = None
self.data = data
self.n_data = len(self.data)
......@@ -110,7 +152,7 @@ class RemoveTrailingSpaces(BaseCheck):
class AddSpacesAroundOperators(BaseCheck):
def __init__(self, data):
super().__init__(data)
self.tokens = Operators()
self.tokens = Tokens(cnf["tokens"]["operators"])
self.check()
def check(self):
......@@ -218,7 +260,7 @@ class AddSpacesAroundOperators(BaseCheck):
class AddSpacesAroundDelimiters(BaseCheck):
def __init__(self, data):
super().__init__(data)
self.tokens = Delimiters()
self.tokens = Tokens(cnf["tokens"]["delimiters"])
self.check()
def check(self):
......@@ -267,79 +309,65 @@ class AddSpacesAroundDelimiters(BaseCheck):
self.data[i] = ''.join(new_line)
class CaseKeywords(BaseCheck):
def __init__(self, data):
class CaseCheck(BaseCheck):
def __init__(self, data, case, splitchars, tokens):
super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")"]
self.reserved_words = ReservedWords()
self.check()
self.case = str.lower if case == "lower" else str.upper
self.splitchars = splitchars
self.tokens = Tokens(tokens)
def check(self):
for i in range(self.n_data):
line = self.data[i]
sline = self.splitline(line)
for word in sline:
if self.reserved_words.is_valid(word):
line = line.replace(word, word.lower(), 1)
if self.tokens.is_valid(word):
line = line.replace(word, self.case(word), 1)
self.data[i] = line
class CaseTypes(BaseCheck):
class CaseReservedWords(CaseCheck):
def __init__(self, data):
super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")"]
self.tokens = Types()
super().__init__(data,
cnf["case"]["reserved-words"]["case"],
cnf["case"]["reserved-words"]["splitchars"],
cnf["tokens"]["reserved-words"])
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):
super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")"]
self.tokens = Conversions()
super().__init__(data,
cnf["case"]["types"]["case"],
cnf["case"]["types"]["splitchars"],
cnf["tokens"]["types"])
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):
super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")"]
self.tokens = Resolutions()
super().__init__(data,
cnf["case"]["conversions"]["case"],
cnf["case"]["conversions"]["splitchars"],
cnf["tokens"]["conversions"])
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(CaseCheck):
def __init__(self, data):
super().__init__(data,
cnf["case"]["resolutions"]["case"],
cnf["case"]["resolutions"]["splitchars"],
cnf["tokens"]["resolutions"])
self.check()
class CaseAttributes(BaseCheck):
class CaseAttributes(CaseCheck):
def __init__(self, data):
super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")", "'"]
self.tokens = Attributes()
super().__init__(data,
cnf["case"]["resolutions"]["case"],
cnf["case"]["resolutions"]["splitchars"],
cnf["tokens"]["attributes"])
self.check()
def check(self):
......@@ -354,51 +382,33 @@ class CaseAttributes(BaseCheck):
self.data[i] = line
class CaseConstants(BaseCheck):
class CaseConstants(CaseCheck):
def __init__(self, data):
super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")", ","]
self.tokens = Constants()
super().__init__(data,
cnf["case"]["constants"]["case"],
cnf["case"]["constants"]["splitchars"],
cnf["tokens"]["constants"])
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):
super().__init__(data)
self.splitchars = [" ", ".", ";", "(", ")", ","]
self.tokens = StandardLogic()
super().__init__(data,
cnf["case"]["standard-logic"]["case"],
cnf["case"]["standard-logic"]["splitchars"],
cnf["tokens"]["standard-logic"])
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):
def __init__(self, data):
super().__init__(data)
self.types = Types()
self.tokens = Tokens(cnf["tokens"]["types"])
self.check()
def check(self):
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}(")
......@@ -454,14 +464,14 @@ class AlignProcedureArgs(BaseCheck):
proc_span = [0, 0]
class Token:
class Tokens:
"""
Base class for tokens
Class for tokens
"""
def __init__(self, tokens):
self._tokens = tokens
def tokens(self):
def all(self):
return self._tokens
def is_valid(self, val):
......@@ -470,72 +480,11 @@ class Token:
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__":
# 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
parser = ArgumentParser(
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
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 time import sleep
from argparse import ArgumentParser, RawTextHelpFormatter
......@@ -71,7 +103,9 @@ class Worker(Process):
"""
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:
cmd += " --verbose"
response = run_cmd(cmd)
......@@ -84,7 +118,7 @@ class Worker(Process):
control = self.control.get()
if control == "stop":
self.stop = True
print(f"stop vsg worker {self.id}")
print(f"stop worker {self.id}")
# get next vhd file to process
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