let widen wh =
    let (_, wh_k_v) = wh in
    let widen_map =
    let decide k v1 v2 =
      let v1 = match v1 with
        None -> V.bottom
      | Some v1 -> v1
      in
      let v2 = match v2 with
        None -> V.bottom
      | Some v2 -> v2
      in
      V.widen (wh_k_v k) v1 v2
    in
    M.generic_merge
      ~cache:("map_Lattice.widen",0)
      ~decide
    in
    fun m1 m2 ->
      match m1, m2 with
      | _ , Top _ -> m2
      | Top _, _ -> assert false (* m2 should be larger than m1 *)
      | Map m1, Map m2 ->
          Map (widen_map m1 m2)