anchor.diff:    | Tm_unknown
     | Tm_uinst _ -> None
     | _ -> failwith ("Impossible! (" ^ (Print.tag_of_term t) ^ ")")
  -
  -and universeof_fastpath env t =
  -  bind_opt (typeof_tot_or_gtot_term_fastpath env t false) (fun k ->
  -    let rec aux (maybe_norm:bool) (k:typ) =
  -      match (SS.compress k).n with
  -      | Tm_type u -> Some u
  -      | Tm_meta (k, _) -> aux maybe_norm k
  -      | Tm_refine (x, _) -> aux maybe_norm x.sort
  -      | Tm_ascribed (k, _, _) -> aux maybe_norm k
  -      | _ ->
  -        if maybe_norm then aux false (N.unfold_whnf env k)
  -        else None in
  -    aux true k)
   
   (*
    * Precondition: G |- t : Tot _ or G |- t : GTot _
  
positive.code:     A possible restructuring would be to treat these two (type and effect) separately
        in the return type
  *)
  let rec typeof_tot_or_gtot_term_fastpath (env:env) (t:term) (must_tot:bool) : option<typ> =
    let mk_tm_type u = S.mk (Tm_type u) t.pos in
    let effect_ok k = (not must_tot) || (N.non_info_norm env k) in
  
negative.code: 
  let universe_of env e =
      if debug env Options.High then
        BU.print1 "Calling universe_of_aux with %s {\n" (Print.term_to_string e);
      let r = universe_of_aux env e in
      if debug env Options.High then
        BU.print1 "Got result from universe_of_aux = %s }\n" (Print.term_to_string r);
      level_of_type env e r
  
  let tc_tparams env0 (tps:binders) : (binders * Env.env * universes) =
  