diff --git a/doc/userman/Makefile b/doc/userman/Makefile
index 5715ebd8a719d259d25ccf05637ab7f6761936b7..433971360454eaafc0c43dccfe11c4a15f044b5e 100644
--- a/doc/userman/Makefile
+++ b/doc/userman/Makefile
@@ -9,7 +9,7 @@ TARGET	= userman
 
 ###########
 
-.PHONY: all install clean
+.PHONY: all install clean $(TARGET).pdf
 
 ifneq ($(VERBOSEMAKE),no)
   SILENT =
diff --git a/doc/userman/analysis-scripts.graphml b/doc/userman/analysis-scripts.graphml
new file mode 100644
index 0000000000000000000000000000000000000000..2c798633e54136b20090b02b064c625b8167cfdc
--- /dev/null
+++ b/doc/userman/analysis-scripts.graphml
@@ -0,0 +1,516 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.19-->
+  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d7" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d0"/>
+    <node id="n0">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="158.0" x="178.625" y="278.3519359999999"/>
+          <y:Fill color="#C0C0C0" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.15992736816406" x="39.92003631591797" xml:space="preserve" y="20.88001251220703">Sources<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="158.0" x="537.625" y="369.8519359999999"/>
+          <y:Fill color="#C0C0C0" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="128.73983764648438" x="14.630081176757812" xml:space="preserve" y="20.88001251220703">GNUmakefile<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="158.0" x="178.625" y="369.8519359999999"/>
+          <y:Fill color="#C0C0C0" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.479949951171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.1798553466797" x="1.4100723266601562" xml:space="preserve" y="7.2600250244140625">Preprocessing
+flags (-I, -D, etc.)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="122.0" width="158.0" x="178.625" y="461.3519359999999"/>
+          <y:Fill color="#C0C0C0" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="112.95989990234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="129.1798553466797" x="14.410072326660156" xml:space="preserve" y="4.520050048828125">Machdep
+(architecture,
+compiler,
+OS)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n4" yfiles.foldertype="group">
+      <data key="d4" xml:space="preserve"/>
+      <data key="d5"/>
+      <data key="d6">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="214.97755415112294" width="160.4375" x="909.0787925720215" y="172.41297124133297"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="160.4375" x="0.0" xml:space="preserve" y="0.0">&lt;target&gt;.parse </y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="4" bottomF="4.176845465453994" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="237.0" width="295.0" x="1056.0625" y="257.95187343896475"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="295.0" x="0.0" xml:space="preserve" y="0.0">target.parse</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="true" closedHeight="237.0" closedWidth="295.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n4:">
+        <node id="n4::n0">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="73.0" width="149.71875" x="914.0787925720215" y="210.92671559558102"/>
+              <y:Fill color="#99CCFF" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_size" fontFamily="Noto Sans" fontSize="18" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="77.54753875732422" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="149.71875" x="0.0" xml:space="preserve" y="-2.2737693786621094">parse.log
+warnings.log
+metrics.log<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n4::n1">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="26.0" width="150.4375" x="914.0787925720215" y="289.5767781566162"/>
+              <y:Fill color="#CCFFCC" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_size" fontFamily="Noto Sans" fontSize="18" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.515846252441406" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="150.4375" x="0.0" xml:space="preserve" y="-1.2579231262207031">framac.ast<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n4::n2">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="26.0" width="150.4375" x="914.0787925720215" y="350.9557568007812"/>
+              <y:Fill color="#FFCC99" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_size" fontFamily="Noto Sans" fontSize="18" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.515846252441406" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="150.4375" x="0.0" xml:space="preserve" y="-1.2579231262207031">stats.txt<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n4::n3">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="26.0" width="150.4375" x="914.0787925720215" y="320.0767781566162"/>
+              <y:Fill color="#FFFF99" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_size" fontFamily="Noto Sans" fontSize="18" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.515846252441406" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="150.4375" x="0.0" xml:space="preserve" y="-1.2579231262207031">framac.sav<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="n5" yfiles.foldertype="group">
+      <data key="d4" xml:space="preserve"/>
+      <data key="d5"/>
+      <data key="d6">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="254.93886947631842" width="159.0" x="909.7975425720215" y="426.6656832358396"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="159.0" x="0.0" xml:space="preserve" y="0.0">&lt;target&gt;.eva </y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="1" topF="1.171266470703074"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="237.0" width="295.0" x="873.25" y="-81.45989990234375"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="295.0" x="0.0" xml:space="preserve" y="0.0">target.parse</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="true" closedHeight="237.0" closedWidth="295.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n5:">
+        <node id="n5::n0">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="123.69433229296885" width="149.0" x="914.7975425720215" y="465.51937416674775"/>
+              <y:Fill color="#99CCFF" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_size" fontFamily="Noto Sans" fontSize="18" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="126.57923126220703" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="149.0" x="0.0" xml:space="preserve" y="-1.4424494846191465">alarms.csv
+eva.log
+warnings.log
+metrics.log
+nonterm.log
+<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n5::n1">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="49.75" width="149.0" x="914.7975425720215" y="625.2137064597166"/>
+              <y:Fill color="#FFCC99" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_size" fontFamily="Noto Sans" fontSize="18" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="53.03169250488281" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="149.0" x="0.0" xml:space="preserve" y="-1.6408462524414062">flamegraph.txt
+stats.txt<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n5::n2">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="26.0" width="149.0" x="914.7975425720215" y="594.2137064597166"/>
+              <y:Fill color="#FFFF99" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_size" fontFamily="Noto Sans" fontSize="18" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.515846252441406" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="149.0" x="0.0" xml:space="preserve" y="-1.2579231262207031">framac.sav<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="158.0" x="1189.5" y="449.40174831689444"/>
+          <y:Fill color="#FFCC99" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.479949951171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="148.71983337402344" x="4.640083312988281" xml:space="preserve" y="7.2600250244140625">Benchmarking/
+Profiling<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="158.0" x="1189.5" y="243.40174831689444"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.479949951171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="135.59983825683594" x="11.200080871582031" xml:space="preserve" y="7.2600250244140625">Pretty-printed
+C source<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="158.0" x="1189.5" y="346.40174831689444"/>
+          <y:Fill color="#99CCFF" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.479949951171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="131.81983947753906" x="13.090080261230469" xml:space="preserve" y="7.2600250244140625">Analysis logs/
+Results<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="239.0" x="941.7975425720215" y="720.8797105555417"/>
+          <y:Fill color="#C0C0C0" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="188.07977294921875" x="25.460113525390625" xml:space="preserve" y="20.88001251220703">Open results in GUI<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="73.0" width="177.0" x="1180.0" y="552.4017483168944"/>
+          <y:Fill color="#FFFF99" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="58.479949951171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="169.69981384277344" x="3.6500930786132812" xml:space="preserve" y="7.2600250244140625">Saved state
+(Frama-C session)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="93.0" width="284.0" x="178.625" y="601.8519359999999"/>
+          <y:Fill color="#C0C0C0" transparent="false"/>
+          <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="85.71992492675781" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="264.419677734375" x="9.7901611328125" xml:space="preserve" y="3.6400375366210938">(Optional)
+JSON Compilation Database
+(compile_commands.json)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <edge id="e0" source="n0" target="n1">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="13.179599999999596" ty="1.600377541666603">
+            <y:Point x="364.0" y="314.8519359999999"/>
+            <y:Point x="364.0" y="407.9523135416665"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="166.88603870451527" y="91.10038483072901">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="11.207369976486891" distanceToCenter="false" position="center" ratio="0.8492785518650576" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n1" target="n4">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="60.5703125" sy="1.6877775416667191" tx="3.5438179240499488" ty="15.159046513427825">
+            <y:Point x="677.1953125" y="295.06079483032227"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="199.45977783203125" x="9.040044168467375" xml:space="preserve" y="-90.39680862426758">make &lt;target&gt;.parse<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="false" position="center" ratio="0.8554216369007797" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n2" target="n1">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="12.550799999999583" sy="1.1907775416665345" tx="10.257687999999916" ty="1.1907775416665345"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="4.971771083282761" y="-32.43774294236715">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="28.437731874658613" distanceToCenter="false" position="left" ratio="7.066285762837311E-5" segment="-1"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n3" target="n1">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="8.16053599999998" ty="1.600377541666603">
+            <y:Point x="364.0" y="522.3519359999999"/>
+            <y:Point x="364.0" y="407.9523135416665"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="5.0" y="-28.7947432453513">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="24.79475053441371" distanceToCenter="false" position="left" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n1" target="n5">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="58.77031249999982" sy="-0.9788891249999097" tx="0.0" ty="0.0">
+            <y:Point x="675.3953124999998" y="554.1351179739988"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="179.47979736328125" x="18.452149164157504" xml:space="preserve" y="95.69732042761211">make &lt;target&gt;.eva<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="false" position="center" ratio="0.774668867229586" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n5::n1" target="n6">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="74.5" sy="0.0" tx="-79.0" ty="0.0"/>
+          <y:LineStyle color="#FF0000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n4::n2" target="n6">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="75.21875" sy="0.0" tx="-79.0" ty="0.0"/>
+          <y:LineStyle color="#FF0000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n4::n0" target="n8">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="74.859375" sy="0.0" tx="-79.0" ty="0.0"/>
+          <y:LineStyle color="#0000FF" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n5::n0" target="n8">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="74.5" sy="0.0" tx="-79.0" ty="0.0"/>
+          <y:LineStyle color="#0000FF" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n4::n1" target="n7">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#008000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n4" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n5" target="n9">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.7024574279785156" sy="-15.095404432332202" tx="-71.29754257202148" ty="-7.339997013875063"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n1" target="n9">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="58.97499999999991" sy="2.6637775416665477" tx="0.0" ty="0.0">
+            <y:Point x="675.3953124999998" y="554.1297501417196"/>
+            <y:Point x="675.3953124999998" y="757.3797105555417"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="214.65975952148438" x="18.08602631745009" xml:space="preserve" y="298.9100526575925">make &lt;target&gt;.eva.gui<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="false" position="center" ratio="0.8150251451233256" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n4::n3" target="n10">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="75.21875" sy="0.0" tx="-88.5" ty="0.0"/>
+          <y:LineStyle color="#FF9900" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n5::n2" target="n10">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="74.5" sy="0.0" tx="-88.5" ty="0.0"/>
+          <y:LineStyle color="#FF9900" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="54.93627077068413" y="19.397853167779658">
+            <y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n11" target="n1">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="43.375" sy="-37.35619205833348" tx="7.111959999999954" ty="1.600377541666603">
+            <y:Point x="364.0" y="407.9523135416665"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Noto Sans" fontSize="20" fontStyle="plain" hasLineColor="false" height="31.239974975585938" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="146.69981384277344" x="7.325258240567905" xml:space="preserve" y="-209.49274718831396">make-template<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.8467602870289302" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d7">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/doc/userman/analysis-scripts.pdf b/doc/userman/analysis-scripts.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..853e0e687779bd694aa87a1786e28038948769d2
Binary files /dev/null and b/doc/userman/analysis-scripts.pdf differ
diff --git a/doc/userman/user-analysis-scripts.tex b/doc/userman/user-analysis-scripts.tex
new file mode 100644
index 0000000000000000000000000000000000000000..901130870c3b664df60a2d85b7b089d4078f9d38
--- /dev/null
+++ b/doc/userman/user-analysis-scripts.tex
@@ -0,0 +1,389 @@
+%% --------------------------------------------------------------------------
+%% --- Analysis scripts
+%% --------------------------------------------------------------------------
+
+\chapter{Analysis Scripts}
+\label{user-analysis-scripts}
+
+This chapter describes some tools and scripts shipped with \FramaC to help
+users setup and run analyses on large code bases. These scripts can also help
+dealing with unfamiliar code and automating analyses.
+
+\section{Requirements}
+
+These analysis scripts are chiefly based on the following tools:
+
+\begin{description}
+\item[Python]: most scripts are written using Python 3. Some scripts require
+  features from specific Python versions, and perform version checks when
+  starting.
+\item[GNU Make]: the main workflow for analysis scripts consists in using
+  GNU Make (4.0 or newer) to compute dependencies and cache intermediate
+  results.
+\item[Bash]: some scripts are written in Bash.
+\end{description}
+
+Besides those, a few tools are occasionally required by the scripts, such as
+Perl and GNU Parallel.
+
+\section{Usage}
+
+Most scripts are accessible via the \texttt{frama-c-script} command, installed
+along with \FramaC. Running this command without any arguments prints the list
+of commands, with a brief description of each of them. Some extra scripts are
+available by directly running them; in both cases, the actual scripts
+themselves are installed in Frama-C's \texttt{share} directory, underneath
+\texttt{analysis-scripts}.
+
+\subsection{General Framework}
+
+{\em Note}: while the analysis scripts are intended for usage in a wide variety
+of scenarios with different plug-ins, they currently focus
+on analyses with the \Value plug-in only.
+
+The main usage mode of \texttt{analysis-scripts} consists in creating a
+Makefile dedicated to the analysis of a C code base.
+
+This Makefile has three main purposes:
+
+\begin{enumerate}
+\item To separate the main analysis steps, saving partial results and logging
+  output messages;
+\item To avoid recomputing unnecessary data when modifying
+  analysis-specific options;
+\item To document analysis options and improve replayability, e.g. when
+  iteratively fine-tuning the analysis in order to improve its results.
+\end{enumerate}
+
+The intended usage is as follows:
+
+\begin{enumerate}
+\item The user identifies a C code base on which they would like to run
+  Frama-C;
+\item The user runs a script to interactively fill a template for
+  the analysis, with the list of source files and required parameters
+  (architecture, preprocessing flags, main function);
+\item The user edits and runs the generated Makefile, adjusting the
+  analysis as needed and re-running \texttt{make}.
+\end{enumerate}
+
+Ideally, after modifying the source code or re-parametrizing the analysis,
+re-running \texttt{make} should be enough to obtain a new result.
+
+Section~\ref{sec:using-generated-makefile} details usage of the Makefile
+and presents an illustrative diagram.
+
+\subsection{Necessary Build Information}
+\label{sec:necessary-build-information}
+
+The command \texttt{frama-c-script make-template} can be used to generate the
+Makefile from a template. The user must fill in the following information,
+required for running an \Value analysis:
+
+\begin{description}
+\item[machdep]: architectural information about system where the code will run:
+  integer type sizes, compiler, OS, etc. See section~\ref{sec:normalize} for
+  more details.
+\item[preprocessing flags]: options given to the C preprocessor, mainly
+  macros (\texttt{-D}) and include directories (\texttt{-I}).
+\item[list of sources]: the actual list of source files that make a logical
+  unit (e.g. a test case or a whole program), without duplicate function
+  definitions.
+\item[main function]: the function where the analysis will start; it is often
+  \texttt{main}, but not always. ({\em Note: \FramaC itself thes not require
+    a \texttt{main} function, but plug-ins such as \texttt{Eva} do}.)
+\end{description}
+
+A project without this information is incomplete; an alternative
+workflow is then necessary. The next section presents some possibilities to
+retrieve such information.
+
+\subsection{Possible Workflows in the Absence of Build Information}
+\label{alternative-workflows}
+
+It is sometimes the case that the \FramaC user is not the developer of the
+code under analysis, and does not have full build information about it;
+or the code contains non-portable features or missing libraries which prevent
+\FramaC from parsing it.
+In such cases, these analysis scripts provide two alternative workflows,
+depending on how one prefers to choose their source files:
+{\em one at a time} or {\em all-in}, described below.
+
+\subsubsection{One at a time}
+
+In this workflow, the user starts from the entry point
+of the analysis: typically the \texttt{main} function of a program or a test
+case. Only the file defining that function is included at first. Then, using
+\texttt{make-wrapper} (described in section~\ref{sec:script-descriptions}),
+the user iteratively adds new sources as needed,
+so that all function definitions are included.
+
+\begin{itemize}
+\item Advantages: higher code coverage; faster preprocessing/parsing; and
+avoids including possibly unrelated files
+(e.g. for an alternative OS/architecture).
+\item Drawbacks: the iterative approach recomputes the analysis several times;
+  also, it may miss files containing global initializers, which are not flagged
+  as missing.
+\end{itemize}
+
+\subsubsection{All-in}
+
+In this workflow, the user adds {\em all} source files to the analysis, and
+if necessary removes some of them, e.g. when there are conflicting definitions,
+such as when multiple test files define a \texttt{main} function.
+
+\begin{itemize}
+\item Advantages: optimistic approach; may not require any extra iterations, if
+  everything is defined, and only once. Does not miss global initializers, and
+  may find issues in code which is not reachable (e.g. syntax-related warnings).
+\item Drawbacks: preprocesses and parses several files which may end up never
+  being used; smaller code coverage; if parsing fails, it may be harder to
+  find the cause (especially if due to unnecessary sources).
+\end{itemize}
+
+\subsection{Using a JSON Compilation Database (JCDB)}
+
+Independently of the chosen workflow, some partial information can be retrieved
+when CMake or Makefile scripts are available for compiling the sources.
+They allow the production of a JSON Compilation Database
+(\texttt{compile\_commands.json}, called JCDB for short; see related option
+in section~\ref{sec:preprocessing}). This leads to a different workflow:
+
+\begin{enumerate}
+\item Run CMake with the flag \texttt{-DCMAKE\_EXPORT\_COMPILE\_COMMANDS=1},
+  or install Build EAR (\url{https://github.com/rizsotto/Bear}) and run
+  \texttt{bear make <targets>} instead of \texttt{make <targets>}. This will
+  create a \texttt{compile\_commands.json} file.
+\item Run \texttt{frama-c-script list-files}. A list of the compiled files,
+  along with files defining a \texttt{main} function, will be presented.
+\item Run \texttt{frama-c-script make-template} to create a template for
+  \FramaC/\Value. Answer ``yes'' when asked about using the
+  \texttt{compile\_commands.json} file.
+\end{enumerate}
+
+Ideally, the above approach should result in a working template. In practice,
+however, the compilation database may include extraneous sources
+(used to compile other files than the target object) and duplicate flags
+(e.g. when compiling the same source for different binary targets or test
+cases). Manual intervention may be necessary.
+
+\section{Using the generated Makefile}
+\label{sec:using-generated-makefile}
+
+The generated Makefile can be used to run one or several analyses.
+The diagram in Fig.~\ref{fig:analysis-scripts} summarizes its usage.
+Makefile targets and outputs are detailed in this section.
+
+\begin{figure}[htbp]
+  \begin{center}
+    \includegraphics[width=\textwidth]{analysis-scripts.pdf}
+    \caption{Overview of the {\em analysis-scripts} workflow:
+      the inputs on the left produce a GNUmakefile which is then used
+      for parsing, analyzing and visualizing results.}
+    \label{fig:analysis-scripts}
+  \end{center}
+\end{figure}
+
+Each analysis is defined in a target, written by the user as follows:
+
+\texttt{<target>.parse: file1.c file2.c ...}
+
+That is, the target name (chosen by the user), suffixed with \texttt{.parse},
+is defined as depending on each of its source files. Changes to any of these
+sources will trigger a recomputation of the AST.
+
+{\em Note:} the target name itself {\em cannot} contain slashes or dots.
+See also the {\em Technical Notes} section about some current limitations.
+
+Then, for each \texttt{.parse} target, a corresponding \texttt{.eva} target
+needs to be added to the \texttt{TARGETS} variable in the Makefile.
+This will run \Value on the test case.
+
+Each \texttt{.eva} target depends on its corresponding \texttt{.parse} target;
+if the sources change, the analysis must take into account the new AST.
+
+\subsection{Important Variables}
+
+Several Makefile variables are available to customize \FramaC; the main
+ones are presented below.
+
+\begin{description}
+\item[TARGETS]: as mentioned before, must contain the list of targets,
+  suffixed with \texttt{.eva}.
+\item[CPPFLAGS]: preprocessing options, passed to \FramaC inside option
+  \texttt{-cpp-extra-args}, when parsing the sources.
+\item[FCFLAGS]: extra command-line options given to \FramaC when parsing the
+  sources and when running analyses. Typically, the options given to the
+  \FramaC kernel.
+\item[EVAFLAGS]: extra command-line options given to \Value when running
+  its analyses.
+\end{description}
+
+These variables are defined globally, but they can also be customized for
+each target; for instance, if a given target \texttt{t1} has a main
+function \texttt{test1} and requires a global macro \texttt{-DTEST1}, but
+target \texttt{t2}'s main function is \texttt{test2} and it requires
+\texttt{-DTEST2}, you can locally modify \texttt{FCFLAGS} and \texttt{CPPFLAGS}
+as follows:
+
+\begin{lstlisting}
+t1.parse: FCFLAGS += -main test1
+t1.parse: CPPFLAGS += -DTEST1
+t2.parse: FCFLAGS += -main test2
+t2.parse: CPPFLAGS += -DTEST2
+\end{lstlisting}
+
+\subsection{Predefined targets}
+
+The predefined targets below are the {\em raison d'être} of the generated
+Makefile; they speed up analyses, provide self-documentation, and enable
+quick iterations during parametrization of the analysis.
+
+\begin{description}
+\item[all (default target)]: the default target simply calls
+  \texttt{<target>.eva}, for each \texttt{<target>} added to variable
+  \texttt{TARGETS}. Does nothing once the analysis is finished and saved.
+\item[<target>.parse]: runs \FramaC on the specified target, preprocessing
+  and parsing its source files. Produces a directory \texttt{<target>.parse}
+  containing several logs, a pretty-printed version of the parsed code, and
+  a \FramaC session file (\texttt{framac.sav}) to be loaded in the GUI or by
+  other analyses. Does nothing if parsing already happened.
+\item[<target>.eva]: loads the parsed result (from the \texttt{.parse} target)
+  and runs the \Value plug-in, with the options given in \texttt{EVAFLAGS}.
+  If the analysis succeeds, produces a directory \texttt{<target>.eva} with the
+  analysis results and a saved session file.
+  Also creates a timestamped version of \texttt{<target>.eva}, to enable
+  future comparisons between different parametrizations. The non-timestamped
+  version corresponds to the latest (successful) analysis.
+  If the analysis fails, tries to save a partial result in
+  \texttt{<target>.eva.error} (when possible).
+\item[<target>.eva.gui]: loads the result of the corresponding
+  \texttt{<target>.eva} session and opens it in the GUI. This allows inspecting
+  the results of \Value. This target always opens the GUI, even when no
+  changes have happened.
+\item[clean]: removes all results produced by the \texttt{.parse} and
+  \texttt{.eva} targets.
+\end{description}
+
+\section{Script Descriptions}
+\label{sec:script-descriptions}
+
+The most useful commands are described below.
+Run \texttt{frama-c-script help} for more details and optional arguments.
+
+\begin{description}
+\item[make-template]: creates the initial Makefile, based on a template.
+  This command creates a file named \texttt{GNUmakefile} with some hardcoded
+  sections, some filled in interactively by the user, and comments indicating
+  which parts may need change. Once created, it enables the general workflow
+  mentioned earlier.
+\item[make-wrapper <target> <args>]: calls \texttt{make <target> <args>} with
+  a special wrapper: when running \Value, upon encountering one of a few known
+  error messages, suggests some actions on how to proceed.
+  For instance, if a missing function definition is encountered when analyzing
+  the code with \Value, the wrapper will look for its definition and, if found,
+  suggest that its source code be added to the analysis. This script is meant
+  to be used with the {\em one at a time} workflow describe in
+  section~\ref{alternative-workflows}.
+\item[find-fun <fun>]: looks for possible declarations and definitions
+  of function \texttt{<fun>}. Uses a heuristic that does not depend on \FramaC
+  being able to parse the sources. Useful to find entry points and missing
+  includes.
+\end{description}
+
+Other commands, only useful in a few cases, are described below.
+
+\begin{description}
+\item[configure <machdep>]: runs a \texttt{configure}
+  script (based on Autoconf) with some settings to emulate a more portable
+  system, removing optional code features that could prevent \FramaC from
+  parsing the sources. Currently still depends partially on the host system,
+  so many features are not disabled.
+\item[make-path] (for \FramaC developers): to be used when Frama-C is not
+  installed in the PATH; adds a \texttt{frama-c-path.mk} file that is used
+  by the Makefile generated by \texttt{make-template}.
+\item[flamegraph]: opens a {\em flamegraph}\footnote{%
+  See \url{https://github.com/brendangregg/FlameGraph} for details about
+  flamegraphs.} to visualize which functions take most of the time
+  during analysis with \Value.
+\item[summary]: for monitoring the progression of multiple analyses defined
+  in a single Makefile. Presents a summary of the analyses when done. Mostly
+  useful for benchmarking or when dealing with several test cases.
+\end{description}
+
+The following commands require a JSON Compilation Database.
+
+\begin{description}
+\item[list-files]: lists all files in the given JCDB. Useful for filling
+  out the Makefile template when running \texttt{make-template}.
+\item[normalize-jcdb]: converts absolute paths inside a
+  \texttt{compile\_commands.json} file into relative paths (w.r.t. PWD)
+  when possible. Used to allow moving/versioning the directory containing
+  the JCDB file.
+\end{description}
+
+Finally, there is the following script, which is {\em not} available as a
+command in \texttt{frama-c-script}, since its usage scenario is very
+different. It is available at\\
+\texttt{\$FRAMAC\_SHARE/analysis-scripts/creduce.sh}.
+
+\begin{description}
+\item[creduce.sh]: A script to help running the C-Reduce\footnote{%
+  See \url{https://embed.cs.utah.edu/creduce} for more details.} tool to minify
+  C programs causing crashes in \FramaC; useful e.g. when submitting a bug
+  report to \FramaC, without needing to submit potentially confidential data.
+  The script contains extensive comments about its usage. It is also
+  described in a post\footnote{%
+    {\em Debugging Frama-C analyses: better privacy with C-Reduce},
+    at \url{https://pub.frama-c.com/scripts/usability/2020/04/02/creduce.html}.}
+  from the \FramaC blog.
+\end{description}
+
+To use the \texttt{creduce.sh} script, you need to have the C-Reduce tool
+installed in your path or in environment variable \texttt{CREDUCE}.
+
+\section{Practical Examples: Open Source Case Studies}
+
+The {\em open-source-case-studies} Git repository (OSCS for short),
+available at \url{https://git.frama-c.com/pub/open-source-case-studies},
+contains several open-source C code bases parametrized with the help of
+analysis scripts. Each case study has its own directory, with a
+\texttt{GNUmakefile} defining one or more analysis targets.
+
+Due to the variety of test cases, OSCS provide practical usage
+examples of the \texttt{GNUmakefile} described in this chapter.
+They are periodically synchronized w.r.t. the public \FramaC repository
+(daily snapshots), so they may contain features not yet available in the
+major \FramaC releases. A few case studies may also contain legacy features
+which are no longer used; but overall, they provide useful examples and allow
+the user to tweak analysis parameters to test their effects.
+
+\section{Technical Notes}
+
+This section lists known issues and technical details which may help users
+understand some unintuitive behaviors.
+
+\paragraph{\em Changes to header files do not trigger a new parsing/analysis.}
+Currently, changes to included files (e.g. headers) are {\em not}
+tracked by the generated Makefile and may require running \texttt{make}
+with \texttt{-B} (to force recomputation of dependencies), or running
+\texttt{make clean} before re-running \texttt{make}.
+
+\paragraph{\em Why is the generated Makefile called \texttt{GNUmakefile}?}
+GNU Make, by default, searches for a file named \texttt{GNUmakefile} before
+searching for a \texttt{Makefile}. Thus, running \texttt{make} without
+arguments results in running the Makefile generated by \texttt{make-template}.
+You can rename it to \texttt{framac.mk} or something else, and then run it
+via \texttt{make -f framac.mk <targets>}.
+
+\paragraph{\em Most scripts are heuristics-based and offer no
+  correctness/completeness guarantees.} In order to handle files {\em before}
+the source preparation step is complete (that is, before \FramaC is able to
+parse the sources into a complete AST), most commands use scripts based on
+syntactic heuristics, which were found to work well in practice but are
+easily disturbed by syntactic changes (e.g. whitespaces).
+
+\paragraph{\em Most commands are experimental.} These analysis scripts are a
+recent addition and subject to changes. They are provided on a best-effort
+basis.
diff --git a/doc/userman/user-intro.tex b/doc/userman/user-intro.tex
index c0245ee59776c667f985a621b36bb22e388150fe..eaaf0c0a778922a5bc1aebfb860b67e9c2ac0d1d 100644
--- a/doc/userman/user-intro.tex
+++ b/doc/userman/user-intro.tex
@@ -53,6 +53,13 @@ The remainder of this manual is organized in several chapters.
   the platform.
 \item[Chapter~\ref{user-gui}] gives a detailed description of the graphical
   user interface of \FramaC.
+\item[Chapter~\ref{user-report}] describes the \texttt{Report} plug-in, used
+  for textual consolidation and export of warnings, errors and properties.
+\item[Chapter~\ref{user-variadic}] presents the \texttt{Variadic} plug-in,
+  used to help other plug-ins handle code containing variadic functions, such
+  as \texttt{printf} and \texttt{scanf}.
+\item[Chapter~\ref{user-analysis-scripts}] details several scripts used to
+  help setup and run analyses on large code bases.
 \item[Chapter~\ref{user-errors}] explains how to report errors \via \FramaC's
   public Gitlab repository.
 \end{description}
diff --git a/doc/userman/user-sources.tex b/doc/userman/user-sources.tex
index ee189cbe97c2d80eb4e448417b23946573c27fa7..e4c5b2f429525043198c6cf2ac42c33cec34f60b 100644
--- a/doc/userman/user-sources.tex
+++ b/doc/userman/user-sources.tex
@@ -1,4 +1,4 @@
-ojson\chapter{Preparing the Sources}
+\chapter{Preparing the Sources}
 \label{user-sources}
 
 This chapter explains how to specify the source files that form the
diff --git a/doc/userman/user-variadic.tex b/doc/userman/user-variadic.tex
index f730beef81b75abcc3f87a86e40ce0e4fe38f3f2..45d55547225e43ab87604c5304f000bc24a9b663 100644
--- a/doc/userman/user-variadic.tex
+++ b/doc/userman/user-variadic.tex
@@ -17,7 +17,7 @@ their prototype by an ellipsis (\ldots) after a set of fixed arguments.
 Some functions in the C standard library are variadic, in particular
 formatted input/output functions, such as \texttt{printf}/\texttt{scanf}.
 Due to the dynamic nature of their arguments, such functions present additional
-challenges to code analysis. The \textttdef{Variadic} helps dealing with some
+challenges to code analysis. The \textttuse{Variadic} helps dealing with some
 of these challenges, reducing or eliminating the need for plug-ins to have
 to deal with these special cases.
 
diff --git a/doc/userman/userman.tex b/doc/userman/userman.tex
index 46e8a404dbee0955045b6755d8f202bfdafd4728..14e4cb255bb86c581c303c71df2b53a06afb9918 100644
--- a/doc/userman/userman.tex
+++ b/doc/userman/userman.tex
@@ -64,6 +64,7 @@ Baudin, Mickaël Delahaye, Philippe Hermann, Benjamin Monate and Dillon Pariente
 \include{user-gui}
 \include{user-report}
 \include{user-variadic}
+\include{user-analysis-scripts}
 \include{user-errors}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%