def spawn_client(self, conn, addr):
     ''' spawning client '''
     make_dir(EnvFileLoc().server_tempdir,
              self._logger)  # make working directory
     workdir = tempfile.mkdtemp(prefix='%s_%s_' % (addr[0], addr[1]),
                                dir=EnvFileLoc().server_tempdir)
     self._logger.info("Working directory is set to %s" % workdir)
     mProboRunServerMode(conn, workdir, addr, self._ur_filename, self._PORT)
def launch(args, csocket=None):
    ''' Launch mProbo '''
    # creating logger
    if csocket != None:  # "logger id"s of clients should be different
        logger_id = generate_random_str(EnvMisc().logger_prefix + '_', 10)
    else:
        logger_id = EnvMisc().logger_prefix
    logger = logging.getLogger(logger_id)
    ch1 = logging.StreamHandler(
        open(os.path.join(args.workdir,
                          EnvFileLoc().logfile), 'w'))
    ch1.setLevel(logging.INFO)
    logger.addHandler(ch1)

    # interrupt handler
    if csocket == None:
        signal.signal(signal.SIGINT, sigint_handler)

    try:  # normal mode without any error or user interrupt
        # Run checks
        logger.info(davemsg.LOGO_001.format(today=printToday()))
        try:
            if ehdnsxmgor(featureinfo()) != True:
                inv = True
        except:
            sys.exit()

        #if args.gui: # launch GUI
        #  logger.info(mcode.INFO_010)
        #  run_mProbo_GUI()
        #  logger.info(mcode.INFO_011)
        #  sys.exit()

        # run mProbo
        amschk_obj = RunChecker(args, csocket, logger_id)()

        # finishing message
        if not args.extract:  # checker mode
            map(logger.info, print_end_msg(mcode.INFO_009, '=='))
        else:  # extraction mode
            map(logger.info, print_end_msg(mcode.INFO_009_1, '=='))
    except:  # handle user interrupt
        m = traceback.format_exc()
        logger.info(m.splitlines()[-1])
        edc = lambda ss, cc: ''.join(
            chr(ord(s) ^ ord(c)) for s, c in zip(ss, cc * 1000))
        #m = edc(m, mcode.INFO_009)
        with open(EnvFileLoc().dump_file, 'w') as f:
            f.write(m)
    logger.removeHandler(ch1)
def pass_args_server():
    ''' process shell command args for mProbo_server '''
    def_userfile = os.path.join(os.environ['DAVE_INST_DIR'],
                                EnvFileLoc().server_userfile)
    def_no_clients = EnvMisc().no_clients
    def_port = int(EnvMisc().server_port)
    parser = argparse.ArgumentParser(
        description='Launch mProbo server application')
    parser.add_argument(
        '-u',
        '--user',
        help='User IP registration file. The default is "%s".' % def_userfile,
        default=def_userfile)
    parser.add_argument('-n',
                        '--number',
                        help='Number of clients. The default is "%s".' %
                        def_no_clients,
                        default=def_no_clients)
    parser.add_argument('-p',
                        '--port',
                        help="Port in server/client mode. The default is %d." %
                        def_port,
                        type=int,
                        default=def_port)
    return parser
  def __init__(self, args, csocket, logger_id='logger_id'):
    self._testfile = args.test # test configuration file name
    self._simfile = args.sim   # simulator configuration file name
    self._workdir = args.workdir # working directory
    self._rptfile = os.path.abspath(os.path.join(self._workdir,args.rpt)) # report file name
    self._cache = args.use_cache # use cached data if True
    self._no_otfc = args.no_otf_check # no on-the-fly check for pin consistency
    self._np = args.process # num. of threads for simulations
    self._goldenonly = args.extract # run in extraction mode
    self._port_xref = args.port_xref # port cross reference filename of modules
    self._csocket = csocket # client socket if any
    self._logger_id = logger_id # logger id string

    self._logger = DaVELogger.get_logger('%s.%s.%s' % (logger_id, __name__, self.__class__.__name__))
    self._mp = LinearModelParameter()

    self._inv = not ehdnsxmgor(featureinfo())

    self._tcfg = TestConfig(self._testfile, port_xref = self._port_xref, logger_id=logger_id) # get test cfg obj
    self._scfg = SimulatorConfig(self._simfile, self._goldenonly, logger_id=logger_id) # get sim cfg obj
    self._rptgen = ReportGenerator(filename=self._rptfile, logger_id=logger_id) # reportgenerator obj

    self._root_rundir = os.path.join(self._workdir, EnvFileLoc().root_rundir) # for e.g. workdir/.mProbo, this will store all the data for the checking
    make_dir(self._workdir, self._logger)
    make_dir(self._root_rundir, self._logger)

    if self._inv: dlrtmvkdldjem()
Exemple #5
0
 def __init__(self, pref_filename, vlog_tb='', logger_id='logger_id'):
     self._logger = DaVELogger.get_logger(
         '%s.%s.%s' %
         (logger_id, __name__, self.__class__.__name__))  # logger
     _envfile = EnvFileLoc()
     if vlog_tb != '':
         self.load_testbench(vlog_tb)
     self._pref = WireCrossReference(
         pref_filename)  # port reference class obj.
Exemple #6
0
 def upload(self, data):
     ''' Receive files from a client '''
     mprobo_rundir = EnvFileLoc().root_rundir
     files = data[len(self._CMD['upload']) + 1:].split()
     files = [
         f[f.rfind('%s' % mprobo_rundir):]
         if f.rfind('%s' % mprobo_rundir) >= 0 else f for f in files
     ]
     new_data = ' '.join([self._CMD['upload']] + files)
     self._csocket.send(new_data)
     for f in files:
         self._fileC2S(f)
     self.clear_command()
Exemple #7
0
  def __init__(self, test_cfg, sim_cfg, testdir='/tmp', rpt=None, goldensim_only=False, revisedsim_only=False, use_cache=False, no_thread=1, no_otfc=False, csocket=None, logger_id='logger_id'):
    ''' 
      test_cfg : test configuration cls object of a single test
      sim_cfg_(golden,revised) : simulator configuration cls object for golden, revised
      testdir : top directory of this test run
      rpt : report cls object
    '''

    # get system reserved words
    self._tenv = EnvTestcfgOption()
    self._tenvf = EnvFileLoc()
    self._tenvs = EnvSimcfg()
    self._logger_id = logger_id
    self._logger = DaVELogger.get_logger('%s.%s.%s' % (logger_id, __name__, self.__class__.__name__)) # logger
    self._inv = not ehdnsxmgor(featureinfo())
    self._csocket = csocket # client socket for server-client mode

    self._rptgen = rpt # report gen obj
    self._cache = use_cache

    self._np = no_thread # no of threads
    self._no_otfc = no_otfc # no on-the-fly check for pin consistency

    sim_cfg_golden = sim_cfg.get_golden()
    sim_cfg_revised = sim_cfg.get_revised()


    # You can run only either golden sim or revised sim if you need by setting golden(revised)sim_only args
    # But, you can't turn them on both
    assert not (goldensim_only and revisedsim_only), mcode.ERR_003
    self.goldensim_only = goldensim_only
    self.revisedsim_only = revisedsim_only

    # make directories for golden and revised models
    self.testdir = testdir
    self._make_dir()

    # Simulator configuration of both golden and revised model.
    self._sim_cfg_golden = sim_cfg_golden
    self._sim_cfg_revised = sim_cfg_revised

    # Test configuration
    self._test_cfg = test_cfg # get test configuration for this unit test
    self._testname = self._test_cfg.get_test_name() # get a test name

    # generate intermediate testbench
    self._tb_golden = TestBench(
                               self._test_cfg,
                               self._sim_cfg_golden, 
                               self.testdir,
                               logger_id=self._logger_id
                               ).get_raw_filename()
    self._tb_revised = TestBench(
                                self._test_cfg,
                                self._sim_cfg_revised, 
                                self.testdir,
                                logger_id=self._logger_id
                                ).get_raw_filename()

    # display wires used in the instances, let user make sure they are all declared.
    #self._print_wires(self._tb_golden)

    # get a porthandler / create port objects from test cfg info.
    self._ph = PortHandler(logger_id=self._logger_id)
    self._create_port(self._test_cfg)

    # get vector generator obj.
    self._tvh = TestVectorGenerator(self._ph, self._test_cfg, logger_id=self._logger_id)

    # running vector instance
    self._rv_golden = RunVector(self._test_cfg, self._sim_cfg_golden, self._ph, self._tb_golden, self._cache, self._csocket, logger_id=self._logger_id)
    self._rv_revised = RunVector(self._test_cfg, self._sim_cfg_revised, self._ph, self._tb_revised, self._cache, self._csocket, logger_id=self._logger_id)

    # get a linear regressor obj.s for pin discrepancy check
    self._lrg_simple = LinearRegressionSM(self._ph, logger_id=self._logger_id)
    self._lrr_simple = LinearRegressionSM(self._ph, logger_id=self._logger_id)

    # get a linear regressor obj.s for pin discrepancy check (suggested)
    self._lrg_sgt_simple = LinearRegressionSM(self._ph, logger_id=self._logger_id)
    self._lrr_sgt_simple = LinearRegressionSM(self._ph, logger_id=self._logger_id)

    # get a linear regressor obj.s
    self._lrg = LinearRegressionSM(self._ph, logger_id=self._logger_id)
    self._lrr = LinearRegressionSM(self._ph, logger_id=self._logger_id)

    # regressor obj for selected model
    self._lrg_sgt = LinearRegressionSM(self._ph, logger_id=self._logger_id)
    self._lrr_sgt = LinearRegressionSM(self._ph, logger_id=self._logger_id)

    if self._cache:
      self._tvh.load_test_vector(self._ph, self.testdir)
    else:
      self._tvh.dump_test_vector(self._ph, self.testdir)

    # report port information
    if self._rptgen != None:
      self._rptgen.load_porthandler_obj(self._ph) # port object of this test
      self._rptgen.print_port_info() # print out 
 def send_result(self):
     self._server.issue_command(
         '@download %s %s/extracted_linear_model.yaml %s' %
         (self._rpt_filename, EnvFileLoc().root_rundir,
          EnvFileLoc().logfile))
class mProboRunServerMode(object):

    _RUNARG_FILE = EnvFileLoc().client_runarg_file

    def __init__(self, conn, workdir, addr, ur_filename, port):
        self._logger = DaVELogger.get_logger(
            '%s.%s.%s' %
            (logger_id, __name__, self.__class__.__name__))  # logger
        self._server = mProboServer(conn, workdir, addr,
                                    logger_id)  # make communication channel
        self._addr = addr
        self._workdir = workdir
        self.check_connection()
        is_valid, no_acct, company = self.validate_user(addr[0], ur_filename)
        t = strftime("%a, %d %b %Y %H:%M:%S", localtime())
        self._logger.info("[CONN] Got a connection from %s (%s) at %s" %
                          (str(addr), company, t))
        if is_valid:
            fn_match_ip = lambda x: x == addr[0]
            ip_addrs = filter(fn_match_ip,
                              get_established_foreign_ip_address(port))
            no_runs = len(ip_addrs)
            if no_runs <= no_acct:
                self.upload_configuration_files()  # get test.cfg & sim.cfg
                self._runargs = self.get_runargs()  # get args of mProbo
                self.run()  # run mProbo
                self.send_result()  #
                self._logger.info("Temporary working directory: %s" %
                                  self._workdir)
            else:
                self._server.issue_command(
                    "@max_license [CONN] Maximum # of licenses for the IP (%s): %s reached. Connection closed"
                    % (addr[0], no_acct))
                self._logger.info(
                    "[CONN] Maximum # of licenses for the IP (%s): %s reached. Connection closed"
                    % (addr[0], no_acct))
        else:
            self._logger.info("[CONN] Invalid IP: %s. Connection closed" %
                              addr[0])
        self.close_connection()
        #self.cleanup_workdir()
        thread.exit()

    def validate_user(self, ip_addr, ur_filename):
        is_valid = False
        with open(ur_filename, 'r') as f:
            for l in f.readlines():
                field = l.strip().split()
                if field[0].startswith('*'): continue
                if fnmatch.fnmatch(ip_addr, field[0]):
                    return True, int(field[1]), field[2].replace('_', ' ')
        self._server.issue_command('@invalid_user User validation failed.')
        return False, 0, ''

    def check_connection(self):
        ''' Check connection '''
        self._server.issue_command('@connect')

    def upload_configuration_files(self):
        ''' upload test/sim configuration files to the server '''
        #self._server.issue_command('@upload %s %s' % (EnvRunArg().testcfg_filename, EnvRunArg().simcfg_filename))
        self._server.issue_command(
            '@upload %s %s %s' % ('test_pp.cfg', 'sim_pp.cfg', 'circuit.scs'))

    def get_runargs(self):
        ''' get mProbo run arguments'''
        self._server.issue_command('@upload %s' % self._RUNARG_FILE)
        argfile = os.path.join(self._workdir, self._RUNARG_FILE)
        with open(argfile, 'r') as f:
            args = f.read()
        rmfile(argfile)
        #args = args + ' -w {wdir} -t {test} -s {sim}'.format(wdir=self._workdir,test=os.path.join(self._workdir,EnvRunArg().testcfg_filename), sim=os.path.join(self._workdir,EnvRunArg().simcfg_filename))
        args = args + ' -w {wdir} -t {test} -s {sim}'.format(
            wdir=self._workdir,
            test=os.path.join(self._workdir, 'test_pp.cfg'),
            sim=os.path.join(self._workdir, 'sim_pp.cfg'))
        return args.split()

    def run(self):
        ''' run mprobo '''
        self._logger.info("Run mProbo")
        args = pass_args().parse_args(self._runargs)
        self._rpt_filename = args.rpt
        launch(args, self._server)

    def send_result(self):
        self._server.issue_command(
            '@download %s %s/extracted_linear_model.yaml %s' %
            (self._rpt_filename, EnvFileLoc().root_rundir,
             EnvFileLoc().logfile))

    def close_connection(self):
        ''' close connection '''
        self._server.issue_command('@close')
        self._logger.info("[CONN] Connection %s closed" % str(self._addr))

    def cleanup_workdir(self):
        ''' delete workdir '''
        shutil.rmtree(self._workdir)
import shutil
import fnmatch
import argparse
import signal
from time import strftime, localtime
from dave.common.davelogger import DaVELogger
from dave.common.misc import rmfile, make_dir, assert_file
from dave.common.netstat import get_established_foreign_ip_address
from dave.mprobo.environ import EnvRunArg, EnvFileLoc, EnvMisc
from dave.mprobo.server import mProboServer
from dave.mprobo.launcher import launch, pass_args

#----------------------------------
# creating logger
logger_id = EnvMisc().logger_prefix + '_server'
logging.basicConfig(filename=EnvFileLoc().server_logfile,
                    filemode='w',
                    level=logging.DEBUG)
logger = logging.getLogger(logger_id)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)


#----------------------------------
def pass_args_server():
    ''' process shell command args for mProbo_server '''
    def_userfile = os.path.join(os.environ['DAVE_INST_DIR'],
                                EnvFileLoc().server_userfile)
    def_no_clients = EnvMisc().no_clients
    def_port = int(EnvMisc().server_port)
Exemple #11
0
#!/usr/bin/env python

import logging
import sys
from dave.mprobo.launcher import launch, pass_args
from dave.mprobo.environ import EnvFileLoc, EnvMisc

__doc__ = ''' mProbo launcher in stand-alone mode [c.f. mProbo_server(client).py] '''

# logger
logging.basicConfig(filename=EnvFileLoc().debug_file,
                    filemode='w',
                    level=logging.DEBUG)
logger = logging.getLogger(EnvMisc().logger_prefix)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.INFO)
logger.addHandler(ch)


def main():
    args = pass_args().parse_args()  # get command-line arguments
    launch(args, csocket=None)  # launch application


if __name__ == "__main__":
    main()