jobfile.py revision 1428
14483Sgblack@eecs.umich.edu# Copyright (c) 2005 The Regents of The University of Michigan 24483Sgblack@eecs.umich.edu# All rights reserved. 34483Sgblack@eecs.umich.edu# 44483Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 54483Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 64483Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 74483Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 84483Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 94483Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 104483Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 114483Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 124483Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 134483Sgblack@eecs.umich.edu# this software without specific prior written permission. 144483Sgblack@eecs.umich.edu# 154483Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 164483Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 174483Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 184483Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 194483Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 204483Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 214483Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 224483Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 234483Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 244483Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 254483Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 264483Sgblack@eecs.umich.edu# 274483Sgblack@eecs.umich.edu# Authors: Nathan Binkert 284483Sgblack@eecs.umich.edu 294483Sgblack@eecs.umich.edufrom os.path import expanduser, isfile, join as joinpath 304483Sgblack@eecs.umich.eduimport sys 314483Sgblack@eecs.umich.edu 324483Sgblack@eecs.umich.edudef crossproduct(options): 334483Sgblack@eecs.umich.edu number = len(options) 344483Sgblack@eecs.umich.edu indexes = [ 0 ] * number 354483Sgblack@eecs.umich.edu maxes = [ len(opt) for opt in options ] 364483Sgblack@eecs.umich.edu def next(): 374483Sgblack@eecs.umich.edu for i in xrange(number - 1, -1, -1): 384483Sgblack@eecs.umich.edu indexes[i] += 1 394483Sgblack@eecs.umich.edu if indexes[i] < maxes[i]: 404483Sgblack@eecs.umich.edu return False 414483Sgblack@eecs.umich.edu 424483Sgblack@eecs.umich.edu indexes[i] = 0 434483Sgblack@eecs.umich.edu return True 444483Sgblack@eecs.umich.edu 454483Sgblack@eecs.umich.edu done = False 464483Sgblack@eecs.umich.edu while not done: 474483Sgblack@eecs.umich.edu result = [] 484483Sgblack@eecs.umich.edu for i in xrange(number): 494483Sgblack@eecs.umich.edu result.append(options[i][indexes[i]]) 504483Sgblack@eecs.umich.edu yield result 514483Sgblack@eecs.umich.edu done = next() 524483Sgblack@eecs.umich.edu 534483Sgblack@eecs.umich.educlass JobFile(object): 544483Sgblack@eecs.umich.edu def __init__(self, jfile): 554483Sgblack@eecs.umich.edu self.data = {} 564483Sgblack@eecs.umich.edu jfile = expanduser(jfile) 574483Sgblack@eecs.umich.edu if not isfile(jfile): 584483Sgblack@eecs.umich.edu for p in sys.path: 594483Sgblack@eecs.umich.edu if isfile(joinpath(p, jfile)): 604483Sgblack@eecs.umich.edu jfile = joinpath(p, jfile) 614483Sgblack@eecs.umich.edu break 624483Sgblack@eecs.umich.edu 634483Sgblack@eecs.umich.edu execfile(jfile, self.data) 644483Sgblack@eecs.umich.edu self.options = self.data['options'] 654483Sgblack@eecs.umich.edu self.environment = self.data['environment'] 664483Sgblack@eecs.umich.edu self.jobinfo = {} 674483Sgblack@eecs.umich.edu self.jobs = [] 684483Sgblack@eecs.umich.edu for job in crossproduct(self.options): 694483Sgblack@eecs.umich.edu jobname = '.'.join([ id[0] for id in job ]) 704483Sgblack@eecs.umich.edu self.jobs.append(jobname) 714483Sgblack@eecs.umich.edu list = [] 724483Sgblack@eecs.umich.edu for info in job: 734483Sgblack@eecs.umich.edu for item in info[1:]: 744483Sgblack@eecs.umich.edu list.append(item) 754483Sgblack@eecs.umich.edu self.jobinfo[jobname] = list 764483Sgblack@eecs.umich.edu 774483Sgblack@eecs.umich.edu def env(self, jobname): 784483Sgblack@eecs.umich.edu env = {} 794483Sgblack@eecs.umich.edu for key,val in self.jobinfo[jobname]: 804483Sgblack@eecs.umich.edu env[key] = val 814483Sgblack@eecs.umich.edu 824483Sgblack@eecs.umich.edu for key,val in self.environment: 834483Sgblack@eecs.umich.edu env[key] = val 844483Sgblack@eecs.umich.edu return env 854483Sgblack@eecs.umich.edu 864483Sgblack@eecs.umich.edu def printinfo(self, jobname): 874483Sgblack@eecs.umich.edu print '%s:' % jobname 884483Sgblack@eecs.umich.edu for key,val in self.jobinfo[jobname]: 894483Sgblack@eecs.umich.edu print ' %s = %s' % (key, val) 904483Sgblack@eecs.umich.edu 914483Sgblack@eecs.umich.edu for key,val in self.environment: 924483Sgblack@eecs.umich.edu print ' %s = %s' % (key, val) 934483Sgblack@eecs.umich.edu