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

  if (x < y) then
    t1=sin(x)*y
    t2=t1*x+i
    y=t1+t2
  else
    y=cos(x)*y
  endif

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 2">

  <xaif:ScopeHierarchy>

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

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

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

  </xaif:ScopeHierarchy>

  <xaif:AliasSetMap>
    <xaif:AliasSet key="0">
      <xaif:AliasRange from_virtual_address="1" to_virtual_address="1"/>
    </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="i" scope_id="2"/>
       <xaif:ArgumentSymbolReference position="2" symbol_id="x" scope_id="2"/>
       <xaif:ArgumentSymbolReference position="3" symbol_id="y" scope_id="2"/>
     </xaif:ArgumentList>

     <xaif:Entry vertex_id="1"/>

     <xaif:If vertex_id="2">
       <xaif:Condition>
         <xaif:BooleanOperation vertex_id="1" name="less_than"/>
         <xaif:VariableReference vertex_id="2">
           <xaif:SymbolReference vertex_id="1" symbol_id="x" scope_id="2"/>
         </xaif:VariableReference>
         <xaif:VariableReference vertex_id="3">
           <xaif:SymbolReference vertex_id="1" symbol_id="y" scope_id="2"/>
         </xaif:VariableReference>
         <xaif:ExpressionEdge edge_id="1" source="2" target="1" position="1"/>
         <xaif:ExpressionEdge edge_id="2" source="3" target="1" position="2"/>
       </xaif:Condition>
     </xaif:If>

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

       <xaif:Assignment statement_id="sage_1">   <!-- t1=sin(x)*y -->
         <xaif:AssignmentLHS>
           <xaif:SymbolReference vertex_id="1" symbol_id="t1" scope_id="2"/>
         </xaif:AssignmentLHS>
         <xaif:AssignmentRHS>
           <xaif:VariableReference vertex_id="1">
             <xaif:SymbolReference vertex_id="1" symbol_id="x" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:Intrinsic vertex_id="2" name="sin_scal"/>
           <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="1" source="1" target="2" position="1"/>
           <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">   <!-- t2=t1*x+i -->
         <xaif:AssignmentLHS>
           <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">  <!-- y=t1+t2 -->
         <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="4" scope_id="2">

       <xaif:Assignment statement_id="sage_4">   <!-- y=cos(x)*y -->
         <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="x" scope_id="2"/>
           </xaif:VariableReference>
           <xaif:Intrinsic vertex_id="2" name="cos_scal"/>
           <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="1" source="1" target="2" position="1"/>
           <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:BasicBlock>     
 
     <xaif:EndBranch vertex_id="5"/>

     <xaif:Exit vertex_id="6"/>

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

  </xaif:ControlFlowGraph>

</xaif:CallGraph>
