let rec print_il = function
    ILstmtIfIFNOT, n, m ) -> Printf.sprintf "ifnot %s goto %d\n" (print_id n) m
  | ILstmtIfIFTRUE, n, m ) -> Printf.sprintf "if %s goto %d\n" (print_id n) m
  | ILstmtSwitch( n, jump_table ) ->
      let print = function
          CASE n, m -> (Big_int.string_of_big_int n)^"=>"^(string_of_int m)
        | DEFAULT, m -> "_=>"^(string_of_int m)
      in
      "switch "^(print_id n)^" {"^(Ctt_printer.print_list print "," jump_table)^"}\n"
  | ILstmtGoto n -> Printf.sprintf "goto %d\n" n
  | ILstmtReturn None -> "return\n"
  | ILstmtReturn (Some n) -> Printf.sprintf "return %s\n" (print_id n)
  | ILstmtAssign( n, t, e ) -> (print_id n)^" : "^(print_c_type t)^" = "^(print_expr e)^"\n"
  | ILstmtRead( n, t, lv, l ) -> (print_id n)^" : "^(print_c_type t)^" = "^(print_lvalue_field (lv, l))^"\n"
  | ILstmtWrite( lv, l, n ) -> (print_lvalue_field (lv, l))^" = "^(print_id n)^"\n"
  | ILstmtInitialize( n, t, i ) -> (print_id n)^" : "^(print_c_type t)^" = [init]\n"
  | ILstmtSequence l -> "begin\n"^(Ctt_printer.print_list print_il "" l)^"end\n"
  | ILstmtParallel l -> "parallel begin\n"^(Ctt_printer.print_list print_il "" l)^"parallel end\n"