| #!/usr/bin/env python3 |
| |
| import json |
| import os |
| import sys |
| |
| import pygraphviz as pgv |
| |
| import common |
| |
| includes = json.load(open(".files.includes.spice.json")) |
| rincludes = json.load(open(".files.rincludes.spice.json")) |
| |
| top = set() |
| for includee in rincludes: |
| if not rincludes[includee]: |
| top.add(includee) |
| top = tuple(sorted(top)) |
| |
| |
| def n(i): |
| i = str(i) |
| return '-'*(4-len(i))+'>'+i |
| |
| |
| number = {} |
| def indent(x, files): |
| for pn in files: |
| print('| '*x+'\-', end="") |
| if pn not in includes: |
| print("!", pn) |
| elif pn in number: |
| i = number[pn] |
| print(n(i), pn) |
| if includes[pn]: |
| print('| '*(x+1)+'\----> ...', '(%d)'%i) |
| else: |
| i = len(number) |
| number[pn] = i |
| print(n(i), pn) |
| indent(x+1, includes[pn]) |
| |
| print() |
| print("Top files") |
| print("-"*75) |
| for pn in top: |
| number.clear() |
| print() |
| print(pn) |
| indent(0, includes[pn]) |
| print("-"*75) |
| |
| version = common.version_extract_from_path(sys.argv.pop(1)) |
| lib = sys.argv.pop(1) |
| |
| |
| G=pgv.AGraph(directed=True, overlap='false', splines='true') |
| G.node_attr.update(sep='0.1', constraint='false') |
| added = set() |
| def create_dot(g, src, files): |
| for pn in files: |
| if pn in added: |
| continue |
| else: |
| added.add(pn) |
| |
| libname = common.lib_extract_from_path(pn) |
| |
| dirname, fname = os.path.split(pn) |
| a, b = os.path.split(dirname) |
| |
| if libname: |
| name = libname+'/'+fname |
| else: |
| name = fname |
| print(pn, libname, name) |
| |
| attrs = {} |
| if pn not in includes: |
| attrs['bgcolor'] = 'red' |
| |
| g.add_node(name, **attrs) |
| if src: |
| g.add_edge(src, name) |
| |
| # Add children |
| if pn in includes: |
| create_dot(g, name, includes[pn]) |
| |
| has_includes = set() |
| for pn in top: |
| if includes[pn]: |
| has_includes.add(pn) |
| |
| for i, pn in enumerate(sorted(has_includes)): |
| |
| v = common.version_extract_from_path(pn) |
| libname = common.lib_extract_from_path(pn) |
| if v != version: |
| continue |
| if libname != lib: |
| continue |
| |
| print() |
| print(pn) |
| #g.graph_attr.update(bgcolor='red', ) |
| g = G.add_subgraph(name='cluster_%04d'%i) |
| create_dot(g, None, [pn]) |
| |
| G.write("spice.includes.%s.%dv%dv%d.dot" % (lib, *version)) |