Source code for qikify.recipes.atesim

import os
import time
import zmq
import csv
import pandas
import msgpack
import fnmatch
import fileinput
from qikify.models import Chip, gz_csv_read


[docs]class ChipDataIterator(object): def __init__(self, data_dir): self.data_dir = data_dir file_list = os.listdir(self.data_dir) csv_files = fnmatch.filter(file_list, '*.csv') csv_gz_files = fnmatch.filter(file_list, '*.csv.gz') assert len(csv_files) > 0 or len(csv_gz_files) > 0, \ 'Error: no data found in filesystem path' if len(csv_files) > len(csv_gz_files): print 'data source: reading %d csv files...' % len(csv_files) self.data = csv_files else: print 'data source: reading %d csv.gz files...' % len(csv_gz_files) self.data = csv_gz_files # this iterator points to the latest chip from the latest wafer file. self.chip_iter = fileinput.input(self.data) self.n_files_read = 0 def __iter__(self): return self
[docs] def next(self): """The call to self.chip_iter.next() will raise StopIteration when done, propagating through to the caller of ChipDataIterator().next(). """ line = self.chip_iter.next().split(',') if self.chip_iter.filelineno() <= 1: # read header line self.header = line print 'reading from file', self.chip_iter.filename() self.n_files_read += 1 return self.next() else: print '[ %7d ]' % (self.chip_iter.lineno() - self.n_files_read), chip_dict = {k : v for k, v in zip(self.header, line) if v.strip() != ''} return Chip(chip_dict, LCT_prefix = 'ORB_')
[docs]class ATESimulator(object): def __init__(self, data_src='filesystem'): """This class is for simulating ATE. It loads data from a data source specified by the argument data_src, and emits Chip() model tuples of data. """ self.data_src = data_src # ZeroMQ socket stuff self.context = zmq.Context() self.socket = self.context.socket(zmq.REP)
[docs] def run(self, port=5570): """This function runs the ATE simulator using CSV files in the current directory. Currently, we only support loading *.csv or *.csv.gz files. """ print 'Running ATE Simulator on port %d ...' % port if self.data_src != 'filesystem': print 'non-filesystem data backends are currently not supported.' return # Run ZeroMQ server self.socket.bind('tcp://127.0.0.1:%d' % port) packer = msgpack.Packer() try: for chip in ChipDataIterator(os.getcwd()): while True: msg = self.socket.recv() print '->', chip.id, msg, if msg == 'REQ:send_LCT': # send chip low-cost test data print 'LCT', time.sleep(1) chip_serialized = packer.pack(chip.LCT) self.socket.send( chip_serialized ) elif msg == 'REQ:send_HCT': # send chip high-cost test data print 'LCT', time.sleep(1) chip_serialized = packer.pack(chip.HCT) self.socket.send( chip_serialized ) elif msg == 'REQ:done': print 'done.' self.socket.send('RES:ack') break else: print 'invalid message---continuing to next chip.' break print '\n ', except KeyboardInterrupt: print '\nterminating ATE simulator.'