<?xml version="1.0" encoding="UTF-8"?>
<!--
subroutine head(x, y) 
  double precision, intent(in) :: x
  double precision, intent(inout) :: y
  double precision t1, t2
  integer i

  i=1
  t1=sin(x)*y
  t2=t1*x+i
  y=t1+t2

end subroutine
-->

<xaif:CallGraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xaif="http://www.mcs.anl.gov/XAIF"
       xsi:schemaLocation="http://www.mcs.anl.gov/XAIF ../xaif.xsd"
       program_name="Example"
       prefix="test_prefix">

  <xaif:ScopeHierarchy>

    <xaif:Scope vertex_id="1">
      <xaif:SymbolTable>
        <xaif:Symbol symbol_id="head" kind="subroutine" type="void"/>
        <xaif:Symbol symbol_id="x"/>
        <xaif:Symbol symbol_id="y"/>
      </xaif:SymbolTable>
    </xaif:Scope>

    <xaif:Scope vertex_id="2">
      <xaif:SymbolTable>
        <xaif:Symbol symbol_id="x"/>
        <xaif:Symbol symbol_id="y"/>
        <xaif:Symbol symbol_id="t1"/>
        <xaif:Symbol symbol_id="t2"/>
        <xaif:Symbol symbol_id="i" type="integer" active="false"/>
      </xaif:SymbolTable>
    </xaif:Scope>

    <xaif:ScopeEdge edge_id="1" source="2" target="1"/>

    <xaif:Scope vertex_id="3">   <!-- bogus scope for testing purposes -->
      <xaif:SymbolTable>
        <xaif:Symbol symbol_id="v"/>
      </xaif:SymbolTable>
    </xaif:Scope>

    <xaif:ScopeEdge edge_id="2" source="3" target="2"/>

  </xaif:ScopeHierarchy>

  <!-- For syntax demo only -->

  <xaif:AliasSetMap>
    <xaif:AliasSet key="0">
    </xaif:AliasSet>
    <xaif:AliasSet key="1">
      <xaif:AliasRange from_virtual_address="1" to_virtual_address="1"/>
      <xaif:AliasRange from_virtual_address="3" to_virtual_address="7"/>
      <xaif:AliasRange from_virtual_address="100" to_virtual_address="100"/>
    </xaif:AliasSet>
    <xaif:AliasSet key="3">
      <xaif:AliasRange from_virtual_address="3" to_virtual_address="7"/>
      <xaif:AliasRange from_virtual_address="9" to_virtual_address="12"/>
    </xaif:AliasSet>
  </xaif:AliasSetMap>

  <xaif:DUUDSetMap>
    <xaif:StmtIdSet key="0">
    </xaif:StmtIdSet>
  </xaif:DUUDSetMap>

  <xaif:DOSetMap>
    <xaif:StmtIdSet key="0">
    </xaif:StmtIdSet>
  </xaif:DOSetMap>



  <xaif:ControlFlowGraph vertex_id="1" symbol_id="head" scope_id="1" controlflowgraph_scope_id="2">

     <xaif:ArgumentList>
       <xaif:ArgumentSymbolReference position="1" symbol_id="x" scope_id="2"/>
       <xaif:ArgumentSymbolReference position="2" symbol_id="y" scope_id="2"/>
     </xaif:ArgumentList>

     <xaif:ModLocal>
       <xaif:SideEffectReference>
         <xaif:SymbolReference vertex_id="1" symbol_id="x" scope_id="2"/>
       </xaif:SideEffectReference>
       <xaif:SideEffectReference>
         <xaif:SymbolReference vertex_id="1" symbol_id="y" scope_id="2"/>
       </xaif:SideEffectReference>
     </xaif:ModLocal>

     <xaif:ReadLocal>
       <xaif:SideEffectReference>
         <xaif:SymbolReference vertex_id="1" symbol_id="x" scope_id="2"/>
       </xaif:SideEffectReference>
     </xaif:ReadLocal>

     <xaif:Entry vertex_id="1"/>

     <xaif:BasicBlock vertex_id="2" scope_id="2">

       <xaif:Assignment statement_id="sage_0">

	       <!-- demo syntax alias info 
	       default = 0 = worst case ("extremely conservative") -->

         <xaif:AssignmentLHS alias="0" live="false">
		 <xaif:SymbolReference vertex_id="1" symbol_id="i" scope_id="2" />
         </xaif:AssignmentLHS>
         <xaif:AssignmentRHS>
           <xaif:Constant vertex_id="1" type="integer" value="1"/>
         </xaif:AssignmentRHS>
       </xaif:Assignment>      

       <xaif:Assignment statement_id="sage_1">
         <xaif:AssignmentLHS live="false">
           <xaif:SymbolReference vertex_id="1" symbol_id="t1" scope_id="2"/>
         </xaif:AssignmentLHS>
         <xaif:AssignmentRHS>
		 <!-- demo syntax alias info
		 1 = key in AliasSetMap -->
		 <xaif:VariableReference vertex_id="1" alias="3">
             <xaif:SymbolReference vertex_id="1" symbol_id="x" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:Intrinsic vertex_id="2" name="sin_scal"/>
           <xaif:ExpressionEdge edge_id="1" source="1" target="2" position="1"/>
           <xaif:VariableReference vertex_id="3">
             <xaif:SymbolReference vertex_id="1" symbol_id="y" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:Intrinsic vertex_id="4" name="mul_scal_scal"/>
           <xaif:ExpressionEdge edge_id="2" source="2" target="4" position="1"/>
           <xaif:ExpressionEdge edge_id="3" source="3" target="4" position="2"/>
         </xaif:AssignmentRHS>
       </xaif:Assignment>      

       <xaif:Assignment statement_id="sage_2">
         <xaif:AssignmentLHS live="false">
           <xaif:SymbolReference vertex_id="1" symbol_id="t2" scope_id="2"/>
         </xaif:AssignmentLHS>
         <xaif:AssignmentRHS>
           <xaif:VariableReference vertex_id="1">
             <xaif:SymbolReference vertex_id="1" symbol_id="t1" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:VariableReference vertex_id="2">
             <xaif:SymbolReference vertex_id="1" symbol_id="x" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:Intrinsic vertex_id="3" name="mul_scal_scal"/>
           <xaif:VariableReference vertex_id="4">
             <xaif:SymbolReference vertex_id="1" symbol_id="i" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:Intrinsic vertex_id="5" name="add_scal_scal"/>
           <xaif:ExpressionEdge edge_id="1" source="1" target="3" position="1"/>
           <xaif:ExpressionEdge edge_id="2" source="2" target="3" position="2"/>
           <xaif:ExpressionEdge edge_id="3" source="3" target="5" position="1"/>
           <xaif:ExpressionEdge edge_id="4" source="4" target="5" position="2"/>
         </xaif:AssignmentRHS>
       </xaif:Assignment>      

       <xaif:Assignment statement_id="sage_3">
         <xaif:AssignmentLHS>
           <xaif:SymbolReference vertex_id="1" symbol_id="y" scope_id="2"/>
         </xaif:AssignmentLHS>
         <xaif:AssignmentRHS>
           <xaif:VariableReference vertex_id="1">
             <xaif:SymbolReference vertex_id="1" symbol_id="t1" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:VariableReference vertex_id="2">
             <xaif:SymbolReference vertex_id="1" symbol_id="t2" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:Intrinsic vertex_id="3" name="add_scal_scal"/>
           <xaif:ExpressionEdge edge_id="1" source="1" target="3" position="1"/>
           <xaif:ExpressionEdge edge_id="2" source="2" target="3" position="2"/>
         </xaif:AssignmentRHS>
       </xaif:Assignment>      

     </xaif:BasicBlock>

     <xaif:BasicBlock vertex_id="3" scope_id="1"/>

     <xaif:Exit vertex_id="4"/>

     <xaif:ControlFlowEdge edge_id="1" source="1" target="2"/>
     <xaif:ControlFlowEdge edge_id="2" source="2" target="3"/>
     <xaif:ControlFlowEdge edge_id="3" source="3" target="4"/>

  </xaif:ControlFlowGraph>

</xaif:CallGraph>

