Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/49394 )
Change subject: python: Get rid of the unused jobfile.py.
......................................................................
python: Get rid of the unused jobfile.py.
This was likely once for managing jobs sent to a batch processing
system, but it's not actually used anywhere in gem5.
Change-Id: I68025eaa45bde9eeb92145a4b91c8f4a184e5250
---
M src/python/SConscript
M src/python/m5/util/__init__.py
D src/python/m5/util/jobfile.py
3 files changed, 0 insertions(+), 471 deletions(-)
diff --git a/src/python/SConscript b/src/python/SConscript
index b6531ef..ddca79a 100644
--- a/src/python/SConscript
+++ b/src/python/SConscript
@@ -52,7 +52,6 @@
PySource('m5.util', 'm5/util/dot_writer_ruby.py')
PySource('m5.util', 'm5/util/fdthelper.py')
PySource('m5.util', 'm5/util/grammar.py')
-PySource('m5.util', 'm5/util/jobfile.py')
PySource('m5.util', 'm5/util/multidict.py')
PySource('m5.util', 'm5/util/pybind.py')
PySource('m5.util', 'm5/util/terminal.py')
diff --git a/src/python/m5/util/__init__.py b/src/python/m5/util/__init__.py
index c73947e..833800d 100644
--- a/src/python/m5/util/__init__.py
+++ b/src/python/m5/util/__init__.py
@@ -42,7 +42,6 @@
import sys
from . import convert
-from . import jobfile
from .attrdict import attrdict, multiattrdict, optiondict
from .code_formatter import code_formatter
diff --git a/src/python/m5/util/jobfile.py b/src/python/m5/util/jobfile.py
deleted file mode 100644
index e262cf1..0000000
--- a/src/python/m5/util/jobfile.py
+++ /dev/null
@@ -1,469 +0,0 @@
-# Copyright (c) 2005-2006 The Regents of The University of Michigan
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met: redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer;
-# redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution;
-# neither the name of the copyright holders nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-import sys
-
-class Data(object):
- def __init__(self, name, desc, **kwargs):
- self.name = name
- self.desc = desc
- self.__dict__.update(kwargs)
-
- def update(self, obj):
- if not isinstance(obj, Data):
- raise AttributeError("can only update from Data object")
-
- for key,val in obj.__dict__.items():
- if key.startswith('_') or key in ('name', 'desc'):
- continue
-
- if key not in self.__dict__:
- self.__dict__[key] = val
- continue
-
- if not isinstance(val, dict):
- if self.__dict__[key] == val:
- continue
-
- raise AttributeError(
- "%s specified more than once old: %s new: %s" % \
- (key, self.__dict__[key], val))
-
- d = self.__dict__[key]
- for k,v in val.items():
- if k in d:
- raise AttributeError(
- "%s specified more than once in %s" % (k, key))
- d[k] = v
-
- if hasattr(self, 'system') and hasattr(obj, 'system'):
- if self.system != obj.system:
- raise AttributeError(
- "conflicting values for system: '%s'/'%s'" % \
- (self.system, obj.system))
-
- def printinfo(self):
- if self.name:
- print('name: %s' % self.name)
- if self.desc:
- print('desc: %s' % self.desc)
- try:
- if self.system:
- print('system: %s' % self.system)
- except AttributeError:
- pass
-
- def printverbose(self):
- for key in self:
- val = self[key]
- if isinstance(val, dict):
- import pprint
- val = pprint.pformat(val)
- print('%-20s = %s' % (key, val))
- print()
-
- def __contains__(self, attr):
- if attr.startswith('_'):
- return False
- return attr in self.__dict__
-
- def __getitem__(self, key):
- if key.startswith('_'):
- raise KeyError("Key '%s' not found" % attr)
- return self.__dict__[key]
-
- def __iter__(self):
- keys = list(self.__dict__.keys())
- keys.sort()
- for key in keys:
- if not key.startswith('_'):
- yield key
-
- def optiondict(self):
- import m5.util
- result = m5.util.optiondict()
- for key in self:
- result[key] = self[key]
- return result
-
- def __repr__(self):
- d = {}
- for key,value in self.__dict__.items():
- if not key.startswith('_'):
- d[key] = value
-
- return "<%s: %s>" % (type(self).__name__, d)
-
- def __str__(self):
- return self.name
-
-class Job(Data):
- def __init__(self, options):
- super(Job, self).__init__('', '')
-
- config = options[0]._config
- for opt in options:
- if opt._config != config:
- raise AttributeError(
- "All options are not from the same Configuration")
-
- self._config = config
- self._groups = [ opt._group for opt in options ]
- self._options = options
-
- self.update(self._config)
- for group in self._groups:
- self.update(group)
-
- self._is_checkpoint = True
-
- for option in self._options:
- self.update(option)
- if not option._group._checkpoint:
- self._is_checkpoint = False
-
- if option._suboption:
- self.update(option._suboption)
- self._is_checkpoint = False
-
- names = [ ]
- for opt in self._options:
- if opt.name:
- names.append(opt.name)
- self.name = ':'.join(names)
-
- descs = [ ]
- for opt in self._options:
- if opt.desc:
- descs.append(opt.desc)
- self.desc = ', '.join(descs)
-
- self._checkpoint = None
- if not self._is_checkpoint:
- opts = []
- for opt in options:
- cpt = opt._group._checkpoint
- if not cpt:
- continue
- if isinstance(cpt, Option):
- opt = cpt.clone(suboptions=False)
- else:
- opt = opt.clone(suboptions=False)
-
- opts.append(opt)
-
- if opts:
- self._checkpoint = Job(opts)
-
- def clone(self):
- return Job(self._options)
-
- def printinfo(self):
- super(Job, self).printinfo()
- if self._checkpoint:
- print('checkpoint: %s' % self._checkpoint.name)
- print('config: %s' % self._config.name)
- print('groups: %s' % [ g.name for g in self._groups ])
- print('options: %s' % [ o.name for o in self._options ])
- super(Job, self).printverbose()
-
-class SubOption(Data):
- def __init__(self, name, desc, **kwargs):
- super(SubOption, self).__init__(name, desc, **kwargs)
- self._number = None
-
-class Option(Data):
- def __init__(self, name, desc, **kwargs):
- super(Option, self).__init__(name, desc, **kwargs)
- self._suboptions = []
- self._suboption = None
- self._number = None
-
- def __getattribute__(self, attr):
- if attr == 'name':
- name = self.__dict__[attr]
- if self._suboption is not None:
- name = '%s:%s' % (name, self._suboption.name)
- return name
-
- if attr == 'desc':
- desc = [ self.__dict__[attr] ]
- if self._suboption is not None and self._suboption.desc:
- desc.append(self._suboption.desc)
- return ', '.join(desc)
-
- return super(Option, self).__getattribute__(attr)
-
- def suboption(self, name, desc, **kwargs):
- subo = SubOption(name, desc, **kwargs)
- subo._config = self._config
- subo._group = self._group
- subo._option = self
- subo._number = len(self._suboptions)
- self._suboptions.append(subo)
- return subo
-
- def clone(self, suboptions=True):
- option = Option(self.__dict__['name'], self.__dict__['desc'])
- option.update(self)
- option._group = self._group
- option._config = self._config
- option._number = self._number
- if suboptions:
- option._suboptions.extend(self._suboptions)
- option._suboption = self._suboption
- return option
-
- def subopts(self):
- if not self._suboptions:
- return [ self ]
-
- subopts = []
- for subo in self._suboptions:
- option = self.clone()
- option._suboption = subo
- subopts.append(option)
-
- return subopts
-
- def printinfo(self):
- super(Option, self).printinfo()
- print('config: %s' % self._config.name)
- super(Option, self).printverbose()
-
-class Group(Data):
- def __init__(self, name, desc, **kwargs):
- super(Group, self).__init__(name, desc, **kwargs)
- self._options = []
- self._number = None
- self._checkpoint = False
-
- def option(self, name, desc, **kwargs):
- opt = Option(name, desc, **kwargs)
- opt._config = self._config
- opt._group = self
- opt._number = len(self._options)
- self._options.append(opt)
- return opt
-
- def options(self):
- return self._options
-
- def subopts(self):
- subopts = []
- for opt in self._options:
- for subo in opt.subopts():
- subopts.append(subo)
- return subopts
-
- def printinfo(self):
- super(Group, self).printinfo()
- print('config: %s' % self._config.name)
- print('options: %s' % [ o.name for o in self._options ])
- super(Group, self).printverbose()
-
-class Configuration(Data):
- def __init__(self, name, desc, **kwargs):
- super(Configuration, self).__init__(name, desc, **kwargs)
- self._groups = []
- self._posfilters = []
- self._negfilters = []
-
- def group(self, name, desc, **kwargs):
- grp = Group(name, desc, **kwargs)
- grp._config = self
- grp._number = len(self._groups)
- self._groups.append(grp)
- return grp
-
- def groups(self):
- return self._groups
-
- def checkchildren(self, kids):
- for kid in kids:
- if kid._config != self:
- raise AttributeError("child from the wrong configuration")
-
- def sortgroups(self, groups):
- groups = [ (grp._number, grp) for grp in groups ]
- groups.sort()
- return [ grp[1] for grp in groups ]
-
- def options(self, groups=None, checkpoint=False):
- if groups is None:
- groups = self._groups
- self.checkchildren(groups)
- groups = self.sortgroups(groups)
- if checkpoint:
- groups = [ grp for grp in groups if grp._checkpoint ]
- optgroups = [ g.options() for g in groups ]
- else:
- optgroups = [ g.subopts() for g in groups ]
- if not optgroups:
- return
-
- import m5.util
- for options in m5.util.crossproduct(optgroups):
- for opt in options:
- cpt = opt._group._checkpoint
- if not isinstance(cpt, bool) and cpt != opt:
- if checkpoint:
- break
- else:
- yield options
- else:
- if checkpoint:
- yield options
-
- def addfilter(self, filt, pos=True):
- import re
- filt = re.compile(filt)
- if pos:
- self._posfilters.append(filt)
- else:
- self._negfilters.append(filt)
-
- def jobfilter(self, job):
- for filt in self._negfilters:
- if filt.match(job.name):
- return False
-
- if not self._posfilters:
- return True
-
- for filt in self._posfilters:
- if filt.match(job.name):
- return True
-
- return False
-
- def checkpoints(self, groups=None):
- for options in self.options(groups, True):
- job = Job(options)
- if self.jobfilter(job):
- yield job
-
- def jobs(self, groups=None):
- for options in self.options(groups, False):
- job = Job(options)
- if self.jobfilter(job):
- yield job
-
- def alljobs(self, groups=None):
- for options in self.options(groups, True):
- yield Job(options)
- for options in self.options(groups, False):
- yield Job(options)
-
- def find(self, jobname):
- for job in self.alljobs():
- if job.name == jobname:
- return job
- else:
- raise AttributeError("job '%s' not found" % jobname)
-
- def job(self, options):
- self.checkchildren(options)
- options = [ (opt._group._number, opt) for opt in options ]
- options.sort()
- options = [ opt[1] for opt in options ]
- job = Job(options)
- return job
-
- def printinfo(self):
- super(Configuration, self).printinfo()
- print('groups: %s' % [ g.name for g in self._groups ])
- super(Configuration, self).printverbose()
-
-def JobFile(jobfile):
- from os.path import expanduser, isfile, join as joinpath
- filename = expanduser(jobfile)
-
- # Can't find filename in the current path, search sys.path
- if not isfile(filename):
- for path in sys.path:
- testname = joinpath(path, filename)
- if isfile(testname):
- filename = testname
- break
- else:
- raise AttributeError("Could not find file '%s'" % jobfile)
-
- data = {}
- exec(compile(open(filename).read(), filename, 'exec'), data)
- if 'conf' not in data:
- raise ImportError('cannot import name conf from %s' % jobfile)
- return data['conf']
-
-def main(conf=None):
- usage = 'Usage: %s [-b] [-c] [-v]' % sys.argv[0]
- if conf is None:
- usage += ' <jobfile>'
-
- try:
- import getopt
- opts, args = getopt.getopt(sys.argv[1:], '-bcv')
- except getopt.GetoptError:
- sys.exit(usage)
-
- both = False
- checkpoint = False
- verbose = False
- for opt,arg in opts:
- if opt == '-b':
- both = True
- checkpoint = True
- if opt == '-c':
- checkpoint = True
- if opt == '-v':
- verbose = True
-
- if conf is None:
- if len(args) != 1:
- raise AttributeError(usage)
- conf = JobFile(args[0])
- else:
- if len(args) != 0:
- raise AttributeError(usage)
-
- if both:
- jobs = conf.alljobs()
- elif checkpoint:
- jobs = conf.checkpoints()
- else:
- jobs = conf.jobs()
-
- for job in jobs:
- if verbose:
- job.printinfo()
- else:
- cpt = ''
- if job._checkpoint:
- cpt = job._checkpoint.name
- print(job.name, cpt)
-
-if __name__ == '__main__':
- main()
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49394
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I68025eaa45bde9eeb92145a4b91c8f4a184e5250
Gerrit-Change-Number: 49394
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s