aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL/cli/DOM.py
blob: dceafc629f3bc1dc9eea246b28116e1cbd8b329a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env python3

from sys import argv
from sys import exit as sysexit

from pathlib import Path

from pydecor import export

from pyGHDL import GHDLBaseException
from pyGHDL.libghdl import LibGHDLException
from pyGHDL.dom.Common import DOMException
from pyGHDL.dom.NonStandard import Design, Document
from pyGHDL.dom.formatting.prettyprint import PrettyPrint, PrettyPrintException

__all__ = []
__api__ = __all__


@export
class Application:
    _design: Design

    def __init__(self):
        self._design = Design()

    def addFile(self, filename: Path, library: str):
        lib = self._design.GetLibrary(library)

        document = Document(filename)
        self._design.AddDocument(document, lib)

    def prettyPrint(self):
        PP = PrettyPrint()

        buffer = []

        buffer.append("Design:")
        for line in PP.formatDesign(self._design, 1):
            buffer.append(line)

        print("\n".join(buffer))


def handleException(ex):
    if isinstance(ex, PrettyPrintException):
        print("PP:", ex)
        return 0
    elif isinstance(ex, DOMException):
        print("DOM:", ex)
        ex2 = ex.__cause__
        if ex2 is not None:
            for message in ex2.InternalErrors:
                print("libghdl: {message}".format(message=message))
        return 4
    elif isinstance(ex, LibGHDLException):
        print("LIB:", ex)
        for message in ex.InternalErrors:
            print("  {message}".format(message=message))
        return 3
    elif isinstance(ex, GHDLBaseException):
        print("GHDL:", ex)
        return 2
    else:
        print(
            "Fatal: An unhandled exception has reached to the top-most exception handler."
        )
        return 1


def main(items=argv[1:]):
    _exitcode = 0

    if len(items) < 1:
        print("Please, provide the files to be analyzed as CLI arguments.")
        print("Using <testsuite/pyunit/SimpleEntity.vhdl> for demo purposes.\n")
        items = ["testsuite/pyunit/Current.vhdl"]

    for item in items:
        try:
            app = Application()
            app.addFile(Path(item), "default_lib")
            app.prettyPrint()
        except Exception as ex:
            _exitcode = handleException(ex)

    return _exitcode


if __name__ == "__main__":
    sysexit(main())