def METHOD_NAME(inputs, iterate_routing_only, run_tag, design):
    global presynth_end_step, iteration_start_step
    if not iterate_routing_only:
        presynth_end_step = "floorplan"
        iteration_start_step = "placement"
    if design.endswith("/"):
        design = design[:-1]
    if run_tag is None:
        print("Presynthesizing...")
        run_tag = presynthesize(design)
        print(f"Done, presynthesized to {run_tag}")
    input_dict = {}
    for kvp in inputs.split(","):
        if not kvp:
            continue
        key, value = kvp.split("=")
        input_dict[key] = value
    count = len(glob.glob(get_run_dir(design, run_tag) + "*"))
    print(f"Running exploration {count} with inputs {input_dict}...")
    design_basename = os.path.basename(design)
    worst_slack = run_and_quantify_closure(
        design, run_tag, input_dict, f"{design_basename}_{count}"
    )
    achieved = worst_slack >= 0
    if achieved:
        print("Timing closure achieved.")
    else:
        print(f"Timing closure failed: worst slack {worst_slack}.")
        exit(os.EX_DATAERR)