diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/simple-timing-ruby.py --- a/tests/configs/simple-timing-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/simple-timing-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -32,14 +32,10 @@ from m5.util import addToPath import os, optparse, sys -# Get paths we might need -config_path = os.path.dirname(os.path.abspath(__file__)) -config_root = os.path.dirname(config_path) -addToPath(config_root+'/configs/common') -addToPath(config_root+'/configs/ruby') -addToPath(config_root+'/configs/topologies') +m5.util.addToPath('../configs/common') +m5.util.addToPath('../configs/') -import Ruby +from ruby import Ruby import Options parser = optparse.OptionParser() diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/gpu-ruby.py --- a/tests/configs/gpu-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/gpu-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -39,14 +39,10 @@ from m5.util import addToPath import os, optparse, sys, math, glob -# Get paths we might need -config_path = os.path.dirname(os.path.abspath(__file__)) -config_root = os.path.dirname(config_path) -addToPath(config_root+'/configs/common') -addToPath(config_root+'/configs/ruby') -addToPath(config_root+'/configs/topologies') +m5.util.addToPath('../configs/common') +m5.util.addToPath('../configs/') -import Ruby +from ruby import Ruby import Options import GPUTLBOptions, GPUTLBConfig diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/memtest-ruby.py --- a/tests/configs/memtest-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/memtest-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -33,15 +33,10 @@ from m5.util import addToPath import os, optparse, sys -# Get paths we might need -config_path = os.path.dirname(os.path.abspath(__file__)) -config_root = os.path.dirname(config_path) -m5_root = os.path.dirname(config_root) -addToPath(config_root+'/configs/common') -addToPath(config_root+'/configs/ruby') -addToPath(config_root+'/configs/topologies') +m5.util.addToPath('../configs/common') +m5.util.addToPath('../configs/') -import Ruby +from ruby import Ruby import Options parser = optparse.OptionParser() diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/o3-timing-mp-ruby.py --- a/tests/configs/o3-timing-mp-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/o3-timing-mp-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -29,7 +29,6 @@ import m5 from m5.objects import * m5.util.addToPath('../configs/common') -m5.util.addToPath('../configs/topologies') nb_cores = 4 cpus = [ DerivO3CPU(cpu_id=i) for i in xrange(nb_cores) ] diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/o3-timing-ruby.py --- a/tests/configs/o3-timing-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/o3-timing-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -29,7 +29,6 @@ import m5 from m5.objects import * m5.util.addToPath('../configs/common') -m5.util.addToPath('../configs/topologies') import ruby_config diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/pc-simple-timing-ruby.py --- a/tests/configs/pc-simple-timing-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/pc-simple-timing-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -32,9 +32,8 @@ from Benchmarks import SysConfig import FSConfig -m5.util.addToPath('../configs/ruby') -m5.util.addToPath('../configs/topologies') -import Ruby +m5.util.addToPath('../configs/') +from ruby import Ruby import Options # Add the ruby specific and protocol specific options diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/rubytest-ruby.py --- a/tests/configs/rubytest-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/rubytest-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -34,15 +34,10 @@ from m5.util import addToPath import os, optparse, sys -# Get paths we might need. It's expected this file is in m5/configs/example. -config_path = os.path.dirname(os.path.abspath(__file__)) -config_root = os.path.dirname(config_path) -m5_root = os.path.dirname(config_root) -addToPath(config_root+'/configs/common') -addToPath(config_root+'/configs/ruby') -addToPath(config_root+'/configs/topologies') +m5.util.addToPath('../configs/common') +m5.util.addToPath('../configs/') -import Ruby +from ruby import Ruby import Options parser = optparse.OptionParser() diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/simple-atomic-mp-ruby.py --- a/tests/configs/simple-atomic-mp-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/simple-atomic-mp-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -28,8 +28,6 @@ import m5 from m5.objects import * -m5.util.addToPath('../configs/topologies') - nb_cores = 4 cpus = [ AtomicSimpleCPU(cpu_id=i) for i in xrange(nb_cores) ] diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/simple-timing-mp-ruby.py --- a/tests/configs/simple-timing-mp-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/simple-timing-mp-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -32,16 +32,11 @@ from m5.util import addToPath import os, optparse, sys -# Get paths we might need -config_path = os.path.dirname(os.path.abspath(__file__)) -config_root = os.path.dirname(config_path) -m5_root = os.path.dirname(config_root) -addToPath(config_root+'/configs/common') -addToPath(config_root+'/configs/ruby') -addToPath(config_root+'/configs/topologies') +m5.util.addToPath('../configs/common') +m5.util.addToPath('../configs/') import Options -import Ruby +from ruby import Ruby parser = optparse.OptionParser() Options.addCommonOptions(parser) diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/AMD_Base_Constructor.py --- a/configs/ruby/AMD_Base_Constructor.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/ruby/AMD_Base_Constructor.py Wed Oct 12 15:30:06 2016 +0100 @@ -39,7 +39,7 @@ from m5.defines import buildEnv from m5.util import convert from CntrlBase import * -from Cluster import Cluster +from topologies.Cluster import Cluster # # Note: the L1 Cache latency is only used by the sequencer on fast path hits diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/GPU_RfO.py --- a/configs/ruby/GPU_RfO.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/ruby/GPU_RfO.py Wed Oct 12 15:30:06 2016 +0100 @@ -40,8 +40,8 @@ from Ruby import create_topology from Ruby import send_evicts -from Cluster import Cluster -from Crossbar import Crossbar +from topologies.Cluster import Cluster +from topologies.Crossbar import Crossbar class CntrlBase: _seqs = 0 diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/GPU_VIPER.py --- a/configs/ruby/GPU_VIPER.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/ruby/GPU_VIPER.py Wed Oct 12 15:30:06 2016 +0100 @@ -40,8 +40,8 @@ from Ruby import create_topology from Ruby import send_evicts -from Cluster import Cluster -from Crossbar import Crossbar +from topologies.Cluster import Cluster +from topologies.Crossbar import Crossbar class CntrlBase: _seqs = 0 diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/GPU_VIPER_Baseline.py --- a/configs/ruby/GPU_VIPER_Baseline.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/ruby/GPU_VIPER_Baseline.py Wed Oct 12 15:30:06 2016 +0100 @@ -40,8 +40,8 @@ from Ruby import create_topology from Ruby import send_evicts -from Cluster import Cluster -from Crossbar import Crossbar +from topologies.Cluster import Cluster +from topologies.Crossbar import Crossbar class CntrlBase: _seqs = 0 diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/GPU_VIPER_Region.py --- a/configs/ruby/GPU_VIPER_Region.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/ruby/GPU_VIPER_Region.py Wed Oct 12 15:30:06 2016 +0100 @@ -39,7 +39,7 @@ from m5.defines import buildEnv from Ruby import send_evicts -from Cluster import Cluster +from topologies.Cluster import Cluster class CntrlBase: _seqs = 0 diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/MOESI_AMD_Base.py --- a/configs/ruby/MOESI_AMD_Base.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/ruby/MOESI_AMD_Base.py Wed Oct 12 15:30:06 2016 +0100 @@ -40,8 +40,8 @@ from Ruby import create_topology from Ruby import send_evicts -from Cluster import Cluster -from Crossbar import Crossbar +from topologies.Cluster import Cluster +from topologies.Crossbar import Crossbar class CntrlBase: _seqs = 0 diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/Ruby.py --- a/configs/ruby/Ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/ruby/Ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -46,10 +46,9 @@ from m5.util import addToPath, fatal import MemConfig -addToPath('../topologies') -addToPath('../network') -import Network +from topologies import * +from network import Network def define_options(parser): # By default, ruby uses the simple timing cpu @@ -80,6 +79,7 @@ protocol = buildEnv['PROTOCOL'] exec "import %s" % protocol eval("%s.define_options(parser)" % protocol) + Network.define_options(parser) def setup_memory_controllers(system, ruby, dir_cntrls, options): ruby.block_size_bytes = options.cacheline_size @@ -141,7 +141,7 @@ found in configs/topologies/BaseTopology.py This is a wrapper for the legacy topologies. """ - exec "import %s as Topo" % options.topology + exec "import topologies.%s as Topo" % options.topology topology = eval("Topo.%s(controllers)" % options.topology) return topology diff -r 220fa4099b9a -r aeab4c3c27ef configs/ruby/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configs/ruby/__init__.py Wed Oct 12 15:30:06 2016 +0100 @@ -0,0 +1,36 @@ +# Copyright (c) 2016 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# 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. +# +# Authors: Andreas Hansson diff -r 220fa4099b9a -r aeab4c3c27ef configs/topologies/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configs/topologies/__init__.py Wed Oct 12 15:30:06 2016 +0100 @@ -0,0 +1,36 @@ +# Copyright (c) 2016 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# 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. +# +# Authors: Andreas Hansson diff -r 220fa4099b9a -r aeab4c3c27ef tests/configs/gpu-randomtest-ruby.py --- a/tests/configs/gpu-randomtest-ruby.py Fri Oct 07 23:56:48 2016 -0400 +++ b/tests/configs/gpu-randomtest-ruby.py Wed Oct 12 15:30:06 2016 +0100 @@ -39,15 +39,10 @@ from m5.util import addToPath import os, optparse, sys -# Get paths we might need. It's expected this file is in m5/configs/example. -config_path = os.path.dirname(os.path.abspath(__file__)) -config_root = os.path.dirname(config_path) -m5_root = os.path.dirname(config_root) -addToPath(config_root+'/configs/common') -addToPath(config_root+'/configs/ruby') -addToPath(config_root+'/configs/topologies') +m5.util.addToPath('../configs/common') +m5.util.addToPath('../configs/') -import Ruby +from ruby import Ruby import Options parser = optparse.OptionParser() diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/apu_se.py --- a/configs/example/apu_se.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/apu_se.py Wed Oct 12 15:30:06 2016 +0100 @@ -42,14 +42,12 @@ from m5.objects import * from m5.util import addToPath -addToPath('../ruby') -addToPath('../network') +addToPath('../') addToPath('../common') -addToPath('../topologies') + +from ruby import Ruby import Options -import Ruby -import Network import Simulation import GPUTLBOptions, GPUTLBConfig @@ -159,7 +157,6 @@ Ruby.define_options(parser) -Network.define_options(parser) #add TLB options to the parser GPUTLBOptions.tlb_options(parser) diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/fs.py --- a/configs/example/fs.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/fs.py Wed Oct 12 15:30:06 2016 +0100 @@ -49,12 +49,10 @@ from m5.objects import * from m5.util import addToPath, fatal +addToPath('../') addToPath('../common') -addToPath('../ruby') -addToPath('../network') -import Ruby -import Network +from ruby import Ruby from FSConfig import * from SysPaths import * @@ -308,7 +306,6 @@ # Add the ruby specific and protocol specific options if '--ruby' in sys.argv: Ruby.define_options(parser) - Network.define_options(parser) (options, args) = parser.parse_args() diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/garnet_synth_traffic.py --- a/configs/example/garnet_synth_traffic.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/garnet_synth_traffic.py Wed Oct 12 15:30:06 2016 +0100 @@ -32,13 +32,10 @@ from m5.util import addToPath import os, optparse, sys addToPath('../common') -addToPath('../ruby') -addToPath('../network') -addToPath('../topologies') +addToPath('../') import Options -import Ruby -import Network +from ruby import Ruby # Get paths we might need. It's expected this file is in m5/configs/example. config_path = os.path.dirname(os.path.abspath(__file__)) @@ -87,7 +84,6 @@ # Add the ruby specific and protocol specific options # Ruby.define_options(parser) -Network.define_options(parser) execfile(os.path.join(config_root, "common", "Options.py")) diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/ruby_direct_test.py --- a/configs/example/ruby_direct_test.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/ruby_direct_test.py Wed Oct 12 15:30:06 2016 +0100 @@ -34,13 +34,10 @@ from m5.util import addToPath import os, optparse, sys addToPath('../common') -addToPath('../ruby') -addToPath('../network') -addToPath('../topologies') +addToPath('../') import Options -import Ruby -import Network +from ruby import Ruby # Get paths we might need. It's expected this file is in m5/configs/example. config_path = os.path.dirname(os.path.abspath(__file__)) @@ -65,7 +62,6 @@ # Add the ruby specific and protocol specific options # Ruby.define_options(parser) -Network.define_options(parser) (options, args) = parser.parse_args() if args: diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/ruby_gpu_random_test.py --- a/configs/example/ruby_gpu_random_test.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/ruby_gpu_random_test.py Wed Oct 12 15:30:06 2016 +0100 @@ -39,13 +39,10 @@ from m5.util import addToPath import os, optparse, sys addToPath('../common') -addToPath('../ruby') -addToPath('../network') -addToPath('../topologies') +addToPath('../') import Options -import Ruby -import Network +from ruby import Ruby # Get paths we might need. config_path = os.path.dirname(os.path.abspath(__file__)) @@ -78,7 +75,6 @@ # Add the ruby specific and protocol specific options # Ruby.define_options(parser) -Network.define_options(parser) execfile(os.path.join(config_root, "common", "Options.py")) diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/ruby_mem_test.py --- a/configs/example/ruby_mem_test.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/ruby_mem_test.py Wed Oct 12 15:30:06 2016 +0100 @@ -34,13 +34,10 @@ from m5.util import addToPath import os, optparse, sys addToPath('../common') -addToPath('../ruby') -addToPath('../network') -addToPath('../topologies') +addToPath('../') import Options -import Ruby -import Network +from ruby import Ruby # Get paths we might need. It's expected this file is in m5/configs/example. config_path = os.path.dirname(os.path.abspath(__file__)) @@ -65,7 +62,6 @@ # Add the ruby specific and protocol specific options # Ruby.define_options(parser) -Network.define_options(parser) execfile(os.path.join(config_root, "common", "Options.py")) diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/ruby_random_test.py --- a/configs/example/ruby_random_test.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/ruby_random_test.py Wed Oct 12 15:30:06 2016 +0100 @@ -34,13 +34,10 @@ from m5.util import addToPath import os, optparse, sys addToPath('../common') -addToPath('../ruby') -addToPath('../network') -addToPath('../topologies') +addToPath('../') import Options -import Ruby -import Network +from ruby import Ruby # Get paths we might need. It's expected this file is in m5/configs/example. config_path = os.path.dirname(os.path.abspath(__file__)) @@ -59,7 +56,6 @@ # Add the ruby specific and protocol specific options # Ruby.define_options(parser) -Network.define_options(parser) execfile(os.path.join(config_root, "common", "Options.py")) diff -r 220fa4099b9a -r aeab4c3c27ef configs/example/se.py --- a/configs/example/se.py Fri Oct 07 23:56:48 2016 -0400 +++ b/configs/example/se.py Wed Oct 12 15:30:06 2016 +0100 @@ -51,13 +51,12 @@ from m5.objects import * from m5.util import addToPath, fatal +addToPath('../') addToPath('../common') -addToPath('../ruby') -addToPath('../network') + +from ruby import Ruby import Options -import Ruby -import Network import Simulation import CacheConfig import CpuConfig @@ -129,7 +128,6 @@ if '--ruby' in sys.argv: Ruby.define_options(parser) - Network.define_options(parser) (options, args) = parser.parse_args() diff -r 220fa4099b9a -r aeab4c3c27ef configs/network/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configs/network/__init__.py Wed Oct 12 15:30:06 2016 +0100 @@ -0,0 +1,36 @@ +# Copyright (c) 2016 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# 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. +# +# Authors: Andreas Hansson