From cf05fa476df711f64d0481117cf075ce68676d57 Mon Sep 17 00:00:00 2001
From: Nathan Binkert <binkertn@umich.edu>
Date: Fri, 11 Mar 2005 18:28:38 -0500
Subject: stick all python stuff into a top level python directory. create an
 m5 package in python/m5 move the objects package into the m5 package move the
 m5config into the m5 package as config leave both importers outside of the
 package.

SConscript:
sim/main.cc:
    move sim/pyconfig/* -> python
python/SConscript:
    m5config.py -> m5/config.py (now automatically embedded)
    objects -> python/m5/objects
    embed all python files in python/m5
python/m5/config.py:
    importer renamed mpy_importer
    move code to m5/__init__.py
test/genini.py:
    deal with new python organization
    keep track of paths we want to add and add them after parameters
    are parsed.

--HG--
rename : sim/pyconfig/SConscript => python/SConscript
rename : sim/pyconfig/m5config.py => python/m5/config.py
rename : objects/AlphaConsole.mpy => python/m5/objects/AlphaConsole.mpy
rename : objects/AlphaTLB.mpy => python/m5/objects/AlphaTLB.mpy
rename : objects/BadDevice.mpy => python/m5/objects/BadDevice.mpy
rename : objects/BaseCPU.mpy => python/m5/objects/BaseCPU.mpy
rename : objects/BaseCache.mpy => python/m5/objects/BaseCache.mpy
rename : objects/BaseSystem.mpy => python/m5/objects/BaseSystem.mpy
rename : objects/Bus.mpy => python/m5/objects/Bus.mpy
rename : objects/CoherenceProtocol.mpy => python/m5/objects/CoherenceProtocol.mpy
rename : objects/Device.mpy => python/m5/objects/Device.mpy
rename : objects/DiskImage.mpy => python/m5/objects/DiskImage.mpy
rename : objects/Ethernet.mpy => python/m5/objects/Ethernet.mpy
rename : objects/Ide.mpy => python/m5/objects/Ide.mpy
rename : objects/IntrControl.mpy => python/m5/objects/IntrControl.mpy
rename : objects/MemTest.mpy => python/m5/objects/MemTest.mpy
rename : objects/Pci.mpy => python/m5/objects/Pci.mpy
rename : objects/PhysicalMemory.mpy => python/m5/objects/PhysicalMemory.mpy
rename : objects/Platform.mpy => python/m5/objects/Platform.mpy
rename : objects/Process.mpy => python/m5/objects/Process.mpy
rename : objects/Repl.mpy => python/m5/objects/Repl.mpy
rename : objects/Root.mpy => python/m5/objects/Root.mpy
rename : objects/SimConsole.mpy => python/m5/objects/SimConsole.mpy
rename : objects/SimpleDisk.mpy => python/m5/objects/SimpleDisk.mpy
rename : objects/Tsunami.mpy => python/m5/objects/Tsunami.mpy
rename : objects/Uart.mpy => python/m5/objects/Uart.mpy
extra : convert_revision : aebf6ccda33028b1125974ca8b6aeab6f7570f30
---
 python/SConscript | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 215 insertions(+)
 create mode 100644 python/SConscript

(limited to 'python/SConscript')

diff --git a/python/SConscript b/python/SConscript
new file mode 100644
index 000000000..81bc52286
--- /dev/null
+++ b/python/SConscript
@@ -0,0 +1,215 @@
+# -*- mode:python -*-
+
+# Copyright (c) 2005 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 os, os.path, re
+
+def WriteEmbeddedPyFile(target, source, path, name, ext, filename):
+    if isinstance(source, str):
+        source = file(source, 'r')
+
+    if isinstance(target, str):
+        target = file(target, 'w')
+
+    print >>target, "AddModule(%s, %s, %s, %s, '''\\" % \
+          (`path`, `name`, `ext`, `filename`)
+
+    for line in source:
+        line = line
+        # escape existing backslashes
+        line = line.replace('\\', '\\\\')
+        # escape existing triple quotes
+        line = line.replace("'''", r"\'\'\'")
+
+        print >>target, line,
+
+    print >>target, "''')"
+    print >>target
+
+def WriteCFile(target, source, name):
+    if isinstance(source, str):
+        source = file(source, 'r')
+
+    if isinstance(target, str):
+        target = file(target, 'w')
+
+    print >>target, 'const char %s_string[] = {' % name
+
+    count = 0
+    from array import array
+    try:
+        while True:
+            foo = array('B')
+            foo.fromfile(source, 10000)
+            l = [ str(i) for i in foo.tolist() ]
+            count += len(l)
+            for i in xrange(0,9999,20):
+                print >>target, ','.join(l[i:i+20]) + ','
+    except EOFError:
+        l = [ str(i) for i in foo.tolist() ]
+        count += len(l)
+        for i in xrange(0,len(l),20):
+            print >>target, ','.join(l[i:i+20]) + ','
+        print >>target, ','.join(l[i:]) + ','
+
+    print >>target, '};'
+    print >>target, 'const int %s_length = %d;' % (name, count)
+    print >>target
+
+def splitpath(path):
+    dir,file = os.path.split(path)
+    path = []
+    assert(file)
+    while dir:
+        dir,base = os.path.split(dir)
+        path.insert(0, base)
+    return path, file
+
+Import('env')
+def MakeEmbeddedPyFile(target, source, env):
+    target = file(str(target[0]), 'w')
+   
+    tree = {}
+    for src in source:
+        src = str(src)
+        path,pyfile = splitpath(src)
+        node = tree
+        for dir in path:
+            if not node.has_key(dir):
+                node[dir] = { }
+            node = node[dir]
+
+        name,ext = pyfile.split('.')
+        if name == '__init__':
+            node['.hasinit'] = True
+        node[pyfile] = (src,name,ext,src)
+
+    done = False
+    while not done:
+        done = True
+        for name,entry in tree.items():
+            if not isinstance(entry, dict): continue
+            if entry.has_key('.hasinit'): continue
+
+            done = False
+            del tree[name]
+            for key,val in entry.iteritems():
+                if tree.has_key(key):
+                    raise NameError, \
+                          "dir already has %s can't add it again" % key
+                tree[key] = val
+
+    files = []
+    def populate(node, path = []):
+        names = node.keys()
+        names.sort()
+        for name in names:
+            if name == '.hasinit':
+                continue
+            
+            entry = node[name]
+            if isinstance(entry, dict):
+                if not entry.has_key('.hasinit'):
+                    raise NameError, 'package directory missing __init__.py'
+                populate(entry, path + [ name ])
+            else:
+                pyfile,name,ext,filename = entry
+                files.append((pyfile, path, name, ext, filename))
+    populate(tree)
+
+    for pyfile, path, name, ext, filename in files:
+        WriteEmbeddedPyFile(target, pyfile, path, name, ext, filename)
+
+def MakeDefinesPyFile(target, source, env):
+    target = file(str(target[0]), 'w')
+
+    print >>target, "import os"
+    defines = env['CPPDEFINES']
+    if isinstance(defines, list):
+        for var in defines:
+            if isinstance(var, tuple):
+                key,val = var
+            else:
+                key,val = var,'True'
+
+            if not isinstance(key, basestring):
+                panic("invalid type for define: %s" % type(key))
+                
+            print >>target, "os.environ['%s'] = '%s'" % (key, val)
+
+    elif isinstance(defines, dict):
+        for key,val in defines.iteritems():
+            print >>target, "os.environ['%s'] = '%s'" % (key, val)
+    else:
+        panic("invalid type for defines: %s" % type(defines))
+
+CFileCounter = 0
+def MakePythonCFile(target, source, env):
+    global CFileCounter
+    target = file(str(target[0]), 'w')
+
+    print >>target, '''\
+#include "base/embedfile.hh"
+
+namespace {
+'''
+    for src in source:
+        src = str(src)
+        fname = os.path.basename(src)
+        name = 'embedded_file%d' % CFileCounter
+        CFileCounter += 1
+        WriteCFile(target, src, name)
+        print >>target, '''\
+EmbedMap %(name)s("%(fname)s",
+    %(name)s_string, %(name)s_length);
+
+''' % locals()
+    print >>target, '''\
+
+/* namespace */ }
+'''
+
+embedded_py_files = [ 'mpy_importer.py', '../util/pbs/jobfile.py' ]
+objpath = os.path.join(env['SRCDIR'], 'python/m5')
+for root, dirs, files in os.walk(objpath, topdown=True):
+    for i,dir in enumerate(dirs):
+        if dir == 'SCCS':
+            del dirs[i]
+            break
+
+    assert(root.startswith(objpath))
+    for f in files:
+        if f.endswith('.mpy') or f.endswith('.py'):
+            embedded_py_files.append(os.path.join(root, f))
+
+embedfile_hh = os.path.join(env['SRCDIR'], 'base/embedfile.hh')
+env.Command('defines.py', None, MakeDefinesPyFile)
+env.Command('embedded_py.py', embedded_py_files, MakeEmbeddedPyFile)
+env.Depends('embedded_py.cc', embedfile_hh)
+env.Command('embedded_py.cc',
+            ['string_importer.py', 'defines.py', 'embedded_py.py'],
+            MakePythonCFile)
-- 
cgit v1.2.3


From 1b841a871ecd717dd8705d12ff7311c6fc97fc63 Mon Sep 17 00:00:00 2001
From: Steve Reinhardt <stever@eecs.umich.edu>
Date: Mon, 14 Mar 2005 07:46:26 -0500
Subject: - Add capability to auto-generate Param structs from .mpy SimObject
 descriptions.  Structs are defined in simobj/param/ObjectName.hh. - Move
 compile-time python params (from CPPDEFINES) to separate dict from run-time
 params (from os.environ). The former are needed to generate proper param
 structs. This also helps prevent users from messing things up by setting the
 wrong environment vars (which could have overridden compile-time settings in
 the old system). - Other misc cleanup of m5 python package.

SConscript:
    Include simobj/SConscript
build/SConstruct:
    Fix type in comment
python/SConscript:
    Move CPPDEFINES dict-generating code to m5scons.flatten_defines
python/m5/__init__.py:
    - Generate a build_env SmartDict here to hold compile-time
    params (passed in via __main__.m5_build_env).
    - Move panic and env here from config.py.
python/m5/config.py:
    Move panic, env to top level (m5/__init__.py)
python/m5/objects/BaseCPU.mpy:
    Use build_env instead of env for compile-time params
python/m5/smartdict.py:
    Add some comments.
sim/sim_object.hh:
    Include auto-generated Param struct.  Not used yet,
    just here as proof of concept.
test/genini.py:
    Put -E arguments in build_env as well as os.environ

--HG--
extra : convert_revision : cf6f4a2565b230c495b33b18612d6030988adac5
---
 python/SConscript | 36 +++++++++++++-----------------------
 1 file changed, 13 insertions(+), 23 deletions(-)

(limited to 'python/SConscript')

diff --git a/python/SConscript b/python/SConscript
index 81bc52286..a50903964 100644
--- a/python/SConscript
+++ b/python/SConscript
@@ -26,7 +26,14 @@
 # (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 os, os.path, re
+import os, os.path, re, sys
+
+Import('env')
+
+# tell python where to find m5 python code
+sys.path.append(os.path.join(env['SRCDIR'], 'python'))
+
+import m5scons
 
 def WriteEmbeddedPyFile(target, source, path, name, ext, filename):
     if isinstance(source, str):
@@ -89,7 +96,6 @@ def splitpath(path):
         path.insert(0, base)
     return path, file
 
-Import('env')
 def MakeEmbeddedPyFile(target, source, env):
     target = file(str(target[0]), 'w')
    
@@ -145,27 +151,11 @@ def MakeEmbeddedPyFile(target, source, env):
         WriteEmbeddedPyFile(target, pyfile, path, name, ext, filename)
 
 def MakeDefinesPyFile(target, source, env):
-    target = file(str(target[0]), 'w')
-
-    print >>target, "import os"
-    defines = env['CPPDEFINES']
-    if isinstance(defines, list):
-        for var in defines:
-            if isinstance(var, tuple):
-                key,val = var
-            else:
-                key,val = var,'True'
-
-            if not isinstance(key, basestring):
-                panic("invalid type for define: %s" % type(key))
-                
-            print >>target, "os.environ['%s'] = '%s'" % (key, val)
-
-    elif isinstance(defines, dict):
-        for key,val in defines.iteritems():
-            print >>target, "os.environ['%s'] = '%s'" % (key, val)
-    else:
-        panic("invalid type for defines: %s" % type(defines))
+    f = file(str(target[0]), 'w')
+    print >>f, "import __main__"
+    print >>f, "__main__.m5_build_env = ",
+    print >>f, m5scons.flatten_defines(env['CPPDEFINES'])
+    f.close()
 
 CFileCounter = 0
 def MakePythonCFile(target, source, env):
-- 
cgit v1.2.3


From de4aa841546daa41da88bb8a427c05ff6cd4df4d Mon Sep 17 00:00:00 2001
From: Steve Reinhardt <stever@eecs.umich.edu>
Date: Mon, 14 Mar 2005 07:52:41 -0500
Subject: Move mpy_importer into m5 package (it logically belongs there since
 it's so tied in with m5.config).

python/SConscript:
    mpy_importer.py now in m5 package

--HG--
extra : convert_revision : 3cd7af4e1cd9338aa6bed5306c824ac5f0965085
---
 python/SConscript | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

(limited to 'python/SConscript')

diff --git a/python/SConscript b/python/SConscript
index a50903964..8404bc4bd 100644
--- a/python/SConscript
+++ b/python/SConscript
@@ -183,8 +183,10 @@ EmbedMap %(name)s("%(fname)s",
 /* namespace */ }
 '''
 
-embedded_py_files = [ 'mpy_importer.py', '../util/pbs/jobfile.py' ]
-objpath = os.path.join(env['SRCDIR'], 'python/m5')
+# base list of .py files to embed
+embedded_py_files = [ '../util/pbs/jobfile.py' ]
+# add all .py and .mpy files in python/m5 
+objpath = os.path.join(env['SRCDIR'], 'python', 'm5')
 for root, dirs, files in os.walk(objpath, topdown=True):
     for i,dir in enumerate(dirs):
         if dir == 'SCCS':
-- 
cgit v1.2.3


From bc2923f78d739ad5ff42dee402c5ba27c02004f1 Mon Sep 17 00:00:00 2001
From: Steve Reinhardt <stever@eecs.umich.edu>
Date: Mon, 14 Mar 2005 14:43:10 -0500
Subject: Move adding SRCDIR/python to sys.path from multiple SConscript files
 to SConstruct.

build/SConstruct:
    Add SRCDIR/python to sys.path here.
python/SConscript:
    Move adding SRCDIR/python to sys.path to SConstruct.

--HG--
extra : convert_revision : f598d670650f5b4fd501caaf073fe38b44d21855
---
 python/SConscript | 3 ---
 1 file changed, 3 deletions(-)

(limited to 'python/SConscript')

diff --git a/python/SConscript b/python/SConscript
index 8404bc4bd..9c15c6d50 100644
--- a/python/SConscript
+++ b/python/SConscript
@@ -30,9 +30,6 @@ import os, os.path, re, sys
 
 Import('env')
 
-# tell python where to find m5 python code
-sys.path.append(os.path.join(env['SRCDIR'], 'python'))
-
 import m5scons
 
 def WriteEmbeddedPyFile(target, source, path, name, ext, filename):
-- 
cgit v1.2.3