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