aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/pyunit/dom/StopWatch.py
diff options
context:
space:
mode:
authorPatrick Lehmann <Paebbels@gmail.com>2023-01-12 05:53:48 +0100
committerGitHub <noreply@github.com>2023-01-12 05:53:48 +0100
commitfb7ef864c019d325f3fc37125e6d6cdc50ae4b83 (patch)
tree8ecca65254f939c987f182531b0cc7e13ff422b3 /testsuite/pyunit/dom/StopWatch.py
parent60774db2a547493b7f89de6239794b7354a0e31f (diff)
downloadghdl-fb7ef864c019d325f3fc37125e6d6cdc50ae4b83.tar.gz
ghdl-fb7ef864c019d325f3fc37125e6d6cdc50ae4b83.tar.bz2
ghdl-fb7ef864c019d325f3fc37125e6d6cdc50ae4b83.zip
Dependency Graphs (#2308)
* Further fixes to the example code. * Bumped dependencies. * Fixed Debouncer example code. * Some more cleanup. * Black's opinion. * Run with pyVHDLModel dev-branch. * Fixed imports for Name. * Fixed test case. * Added a formatter to write dependency graphs and hierarchy as graphml. * Improved GraphML formatting. * Write compile order graph. * Computing compile order. * Bumped dependencies. * Black's opinion. * Fixed incorrect dependency.
Diffstat (limited to 'testsuite/pyunit/dom/StopWatch.py')
-rw-r--r--testsuite/pyunit/dom/StopWatch.py73
1 files changed, 64 insertions, 9 deletions
diff --git a/testsuite/pyunit/dom/StopWatch.py b/testsuite/pyunit/dom/StopWatch.py
index 6301eb1df..deab50a9f 100644
--- a/testsuite/pyunit/dom/StopWatch.py
+++ b/testsuite/pyunit/dom/StopWatch.py
@@ -30,11 +30,20 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
# ============================================================================
+from time import perf_counter_ns as time_perf_counter
from pathlib import Path
+from textwrap import dedent
+from typing import Dict, List
from unittest import TestCase
+from pyTooling.Graph import Vertex
+
+import pyVHDLModel
+import pyVHDLModel.DesignUnit
from pyGHDL.dom.NonStandard import Design, Document
+from pyGHDL.dom.formatting.GraphML import DependencyGraphFormatter, HierarchyGraphFormatter, CompileOrderGraphFormatter
from pyGHDL.dom.formatting.prettyprint import PrettyPrint
+from pyVHDLModel import DependencyGraphVertexKind, DependencyGraphEdgeKind, Library
if __name__ == "__main__":
print("ERROR: you called a testcase declaration file as an executable module.")
@@ -106,19 +115,65 @@ class Display(Designs):
class CompileOrder(Designs):
def test_Encoder(self):
+ print()
design = Design()
- design.LoadStdLibrary()
- design.LoadIEEELibrary()
- for lib, file in self._encoderFiles:
+ design.LoadDefaultLibraries()
+ t1 = time_perf_counter()
+ for lib, file in self._stopwatchFiles:
library = design.GetLibrary(lib)
document = Document(self._sourceDirectory / file)
design.AddDocument(document, library)
+ print(dedent("""\
+ file: {}
+ libghdl processing time: {:5.3f} us
+ DOM translation time: {:5.3f} us
+ """
+ ).format(
+ document.Path,
+ document.LibGHDLProcessingTime * 10**6,
+ document.DOMTranslationTime * 10**6,
+ )
+ )
+ pyGHDLTime = time_perf_counter() - t1
design.Analyze()
- PP = PrettyPrint()
- buffer = []
- buffer.append("Design:")
- for line in PP.formatDesign(design, 1):
- buffer.append(line)
- print("\n".join(buffer))
+ toplevel = [root.Value.Identifier for root in design.HierarchyGraph.IterateRoots()]
+
+ print(dedent("""
+ pyGHDL:
+ sum: {:5.3f} us
+ Analysis:
+ default library load time: {:5.3f} us
+ dependency analysis time: {:5.3f} us
+ Toplevel: {toplevel}
+ Compile order:\
+ """
+ ).format(
+ pyGHDLTime * 10**6,
+ design._loadDefaultLibraryTime * 10**6,
+ design._analyzeTime * 10**6,
+ toplevel=", ".join(toplevel)
+ )
+ )
+ for i, vertex in enumerate(design.IterateDocumentsInCompileOrder()):
+ print(f" {i:<2}: {vertex.Value.Path.relative_to(Path.cwd())}")
+
+ graphML = Path("dependencies.graphml")
+ dependencyFormatter = DependencyGraphFormatter(design.DependencyGraph)
+ dependencyFormatter.WriteGraphML(graphML)
+
+ graphML = Path("hierarchy.graphml")
+ hierarchyFormatter = HierarchyGraphFormatter(design.HierarchyGraph)
+ hierarchyFormatter.WriteGraphML(graphML)
+
+ graphML = Path("compileorder.graphml")
+ compileOrderFormatter = CompileOrderGraphFormatter(design.CompileOrderGraph)
+ compileOrderFormatter.WriteGraphML(graphML)
+
+ # PP = PrettyPrint()
+ # buffer = []
+ # buffer.append("Design:")
+ # for line in PP.formatDesign(design, 1):
+ # buffer.append(line)
+ # print("\n".join(buffer))