Ejemplo n.º 1
0
def calibrate(dev, runtime, block, inst, cfg):
    assert (cfg.inst.block == block.name)
    assert (cfg.inst.loc == inst)
    new_adp = adplib.ADP()
    new_adp.add_instance(block, inst)
    config = new_adp.configs.get(block.name, \
                                 inst)
    config.set_config(cfg)
    all_codes = calibrate(runtime,block,inst, \
                                new_adp, \
                                method=llenums.CalibrateObjective.MAXIMIZE_FIT)
    print(all_codes)
Ejemplo n.º 2
0
def generate_adp(board, blk, loc, cfg):
    adp_file = get_adp(board, blk, loc, cfg)

    new_adp = adplib.ADP()
    new_adp.add_instance(blk, loc)
    blkcfg = new_adp.configs.get(blk.name, loc)
    blkcfg.set_config(cfg)

    with open(adp_file, 'w') as fh:
        text = json.dumps(new_adp.to_json())
        fh.write(text)

    return adp_file
Ejemplo n.º 3
0
def profile_hidden_state(runtime, dev, planner, hidden, adp=None, quiet=False):
    # make new config for profiling operation
    if adp is None:
        new_adp = adplib.ADP()
        new_adp.add_instance(planner.block, planner.loc)
    else:
        new_adp = adp.copy(dev)

    config = new_adp.configs.get(planner.block.name, \
                                    planner.loc)
    config.set_config(planner.config)

    # set hidden state
    for state_var, value in hidden.items():
        stmt = config.get(state_var)
        assert (isinstance(stmt, adplib.StateConfig))
        stmt.value = value

    planner.new_dynamic()
    output = planner.output
    method = planner.method
    dynamic = planner.next_dynamic()
    while not dynamic is None:
        input_vals = {}
        for name, value in dynamic.items():
            if planner.block.data.has(name):
                assert(isinstance(config[name],  \
                                  adplib.ConstDataConfig))
                config[name].value = value
            else:
                st = planner.block.inputs[name]
                input_vals[st.ll_identifier] = value

        if not quiet:
            print("-> input %s" % str(dynamic))

        profile(runtime, \
                dev, \
                planner.block, \
                planner.loc, \
                new_adp, \
                output.ll_identifier, \
                method=method, \
                inputs=input_vals, \
                quiet=quiet)

        dynamic = planner.next_dynamic()
Ejemplo n.º 4
0
def calibrate(runtime,dev,blk,loc,adp, \
              calib_obj=llenums.CalibrateObjective.MAXIMIZE_FIT):
    state_t = {blk.name: blk.state.concretize(adp, loc)}
    # build set state command
    loc_t, loc_d = make_block_loc_t(blk, loc)
    set_state_data = {"inst": loc_d, "state": state_t}
    cmd_t, cmd_data = make_circ_cmd(llenums.CircCmdType.SET_STATE,
                                    set_state_data)
    cmd = cmd_t.build(cmd_data, debug=True)
    # execute set state command
    print("-> setting state")
    print(state_t)
    runtime.execute(cmd)
    resp = unpack_response(runtime.result())

    cmd_t, cmd_data = make_circ_cmd(llenums.CircCmdType.GET_STATE,
                                    set_state_data)
    cmd = cmd_t.build(cmd_data, debug=True)
    # execute set state command

    calibrate_data = {"calib_obj": calib_obj.name, \
                      "inst": loc_d}
    cmd_t, cmd_data = make_circ_cmd(llenums.CircCmdType.CALIBRATE,
                                    calibrate_data)

    print(cmd_data)
    print("-> calibrating block")
    cmd = cmd_t.build(cmd_data, debug=True)
    runtime.execute(cmd)

    resp = unpack_response(runtime.result())
    state = resp[blk.name]
    print("response: %s" % str(state))

    new_adp = adplib.ADP()
    new_adp.add_instance(blk, loc)
    blk.state.lift(new_adp, loc, dict(state))
    blkcfg = new_adp.configs.get(blk.name, loc)
    return blkcfg
Ejemplo n.º 5
0
def to_adp(vadps):
    adp = adplib.ADP()
    for stmt in vadps:
        if isinstance(stmt, VADPConfig):
            block = stmt.target.block
            loc = stmt.target.ident
            adp.add_instance(block, loc)
            cfg = adp.configs.get(block.name, loc)
            cfg.modes = stmt.mode
            for datafield, value in stmt.assigns.items():
                if (isinstance(cfg[datafield], adplib.ExprDataConfig)):
                    cfg[datafield].expr = value

                elif (isinstance(cfg[datafield], adplib.ConstDataConfig)):
                    cfg[datafield].value = value.compute()
                else:
                    raise Exception("cannot set field <%s>" % datafield)

        elif isinstance(stmt, VADPConn):
            sb = stmt.source.block
            sl = stmt.source.ident
            sp = stmt.source.port
            db = stmt.sink.block
            dl = stmt.sink.ident
            dp = stmt.sink.port
            adp.add_conn(sb, sl, sp, db, dl, dp)

    for stmt in vadps:
        if isinstance(stmt, VADPSource):
            block = stmt.target.block
            loc = stmt.target.ident
            port = stmt.target.port
            dsexpr = stmt.dsexpr
            adp.add_source(block, loc, port, dsexpr)

    return adp
Ejemplo n.º 6
0
def characterize(runtime,board,block,_cfg,locs, \
                 grid_size=7,  \
                 num_hidden_codes=200):
  print("=> characterizing %s" % block.name)
  for loc in locs:
    adp = adplib.ADP()
    cfg = _cfg.copy()
    adp.add_instance(block,loc)
    cfg.inst.loc = loc
    adp.configs.get(block.name,loc).set_config(cfg)

    new_adp = runtime_util.make_block_test_adp(board,adp,block,cfg)
    new_cfg = new_adp.configs.get(block.name,loc)
    print("=== %s.%s ===" % (block.name,loc))
    print(new_cfg)
    print("grid-size: %d / num-codes: %d / num-locs: %d" % (grid_size, \
                                                            num_hidden_codes, \
                                                            len(locs)))
    if not has_hidden_codes(block,loc,new_cfg):
      return

    random_hidden_codes = list(planlib.RandomCodeIterator(block,loc,new_cfg, \
                                                          num_hidden_codes))
    for hidden_code in random_hidden_codes:
        for output in block.outputs:
                for method,n,m,reps in runtime_util.get_profiling_steps(output,new_cfg,grid_size):
                        planner = planlib.SingleTargetedPointPlanner(block,  \
                                                                     loc,  \
                                                                     output, \
                                                                     new_cfg, \
                                                                     method,
                                                                     n=n,
                                                                     m=m,
                                                                     reps=reps,
                                                                     hidden_codes=hidden_code)
                        proflib.profile_all_hidden_states(runtime, board, planner, adp=new_adp, quiet=True)
Ejemplo n.º 7
0
def profile(runtime,dev, \
            blk,loc,adp,output_port, \
            inputs, \
            method=llenums.ProfileOpType.INPUT_OUTPUT,quiet=False):
    state_t = {blk.name: blk.state.concretize(adp, loc)}
    # build profiling command
    loc_t, loc_d = llutil.make_block_loc_t(blk, loc)
    values = [0.0] * 2
    for input_ident, input_val in inputs.items():
        values[input_ident.code()] = input_val
    if not quiet:
        print("profile-inputs: %s" % values)
    profile_data = {"method": method.name, \
                    "inst": loc_d,
                    "in_vals": values, \
                    "state":state_t,
                    "output":output_port.name}

    cmd_t, cmd_data = llutil.make_circ_cmd(llenums.CircCmdType.PROFILE,
                                           profile_data)
    cmd = cmd_t.build(cmd_data, debug=True)
    # execute profiling command
    runtime.execute(cmd)
    resp = llutil.unpack_response(runtime.result(quiet=quiet))

    # reconstruct analog device program
    new_adp = adplib.ADP()
    blk, loc = llutil.from_block_loc_t(dev, resp['spec']['inst'])
    new_adp.add_instance(blk, loc)
    state = resp['spec']['state'][blk.name]
    blk.state.lift(new_adp, loc, dict(state))
    blkcfg = new_adp.configs.get(blk.name, loc)

    # retrieve parameters for new result
    inputs = {}
    port = llutil.get_by_ll_identifier(blk.inputs, llenums.PortType.IN0)
    if not port is None:
        inputs[port.name] = resp['spec']['in_vals'][
            llenums.PortType.IN0.code()]
        if not quiet:
            print("in %s = %f" % (port.name, inputs[port.name]))

    port = llutil.get_by_ll_identifier(blk.inputs, llenums.PortType.IN1)
    if not port is None:
        inputs[port.name] = resp['spec']['in_vals'][
            llenums.PortType.IN1.code()]

    new_out = llutil.get_by_ll_identifier(blk.outputs,  \
                                llenums.PortType \
                                   .from_code(int(resp['spec']['output'])))

    new_method = llenums.ProfileOpType.from_code(int(resp['spec']['method']))
    out_mean = resp['mean']
    out_std = resp['stdev']
    out_status = llenums.ProfileStatus.from_code(int(resp['status']))
    if not quiet:
        print("datum inputs=%s out=%f std=%f status=%s" %
              (inputs, out_mean, out_std, out_status.value))
        print(blkcfg)

    # insert into database
    if out_status == llenums.ProfileStatus.SUCCESS:
        dataset = exp_profile_lib.load(dev, blk, loc, new_out, blkcfg, method)
        if dataset is None:
            dataset = exp_profile_lib.ExpProfileDataset(blk, \
                                                        loc, \
                                                        new_out, \
                                                        blkcfg, \
                                                        new_method)

        dataset.add(config=blkcfg, \
                    inputs=inputs, \
                    mean=out_mean, \
                    std=out_std)

        exp_profile_lib.update(dev, dataset)

    return blkcfg