51 lines · python
1#!/usr/bin/env python2 3# This script extracts the VPlan digraphs from the vectoriser debug messages4# and saves them in individual dot files (one for each plan). Optionally, and5# providing 'dot' is installed, it can also render the dot into a PNG file.6 7from __future__ import print_function8 9import sys10import re11import argparse12import shutil13import subprocess14 15parser = argparse.ArgumentParser()16parser.add_argument("--png", action="store_true")17args = parser.parse_args()18 19dot = shutil.which("dot")20if args.png and not dot:21 raise RuntimeError("Can't export to PNG without 'dot' in the system")22 23pattern = re.compile(r"(digraph VPlan {.*?\n})", re.DOTALL)24matches = re.findall(pattern, sys.stdin.read())25 26for vplan in matches:27 m = re.search("graph \[.+(VF=.+,UF.+)", vplan)28 if not m:29 raise ValueError("Can't get the right VPlan name")30 name = re.sub("[^a-zA-Z0-9]", "", m.group(1))31 32 if args.png:33 filename = "VPlan" + name + ".png"34 print("Exporting " + name + " to PNG via dot: " + filename)35 p = subprocess.Popen(36 [dot, "-Tpng", "-o", filename],37 encoding="utf-8",38 stdin=subprocess.PIPE,39 stdout=subprocess.PIPE,40 stderr=subprocess.PIPE,41 )42 out, err = p.communicate(input=vplan)43 if err:44 raise RuntimeError("Error running dot: " + err)45 46 else:47 filename = "VPlan" + name + ".dot"48 print("Exporting " + name + " to DOT: " + filename)49 with open(filename, "w") as out:50 out.write(vplan)51