+ L.error BrgR.specs (L.Warn s :: L.Loc :: msg); flush ()
+
+let process_entity f st =
+ let f ast = f {st with ast = ast} in
+ AP.process_entity f st.ast
+
+(* kernel related ***********************************************************)
+
+type kernel = Brg | Bag
+
+type kernel_entity = BrgEntity of Brg.entity
+ | BagEntity of Bag.entity
+
+let kernel = ref Brg
+
+let print_counters st = match !kernel with
+ | Brg -> BrgO.print_counters C.start st.brgc
+ | Bag -> BagO.print_counters C.start st.bagc
+
+let kernel_of_meta f st entity = match !kernel with
+ | Brg ->
+ let f entity = f st (BrgEntity entity) in
+ MBrg.brg_of_meta f entity
+ | Bag ->
+ let f entity = f st (BagEntity entity) in
+ MBag.bag_of_meta f entity
+
+let count_entity st = function
+ | BrgEntity entity -> {st with brgc = count BrgO.count_entity st.brgc entity}
+ | BagEntity entity -> {st with bagc = count BagO.count_entity st.bagc entity}
+
+let export_entity si g = function
+ | BrgEntity entity -> G.export_entity BrgO.export_entry si g entity
+ | BagEntity _ -> ()
+
+let type_check f st si g k =
+ let brg_err msg = brg_error "Type Error" msg; failwith "Interrupted" in
+ let f _ = function
+ | None -> f st None
+ | Some (i, u, _) -> f st (Some (i, u))
+ in
+ match k with
+ | BrgEntity entity -> BrgU.type_check brg_err f ~si g entity
+ | BagEntity entity -> BagU.type_check f ~si g entity
+
+(****************************************************************************)