diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/COPYING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/COPYING Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/COPYING.LESSER
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/COPYING.LESSER Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/Doxyfile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/Doxyfile Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,1538 @@
+# Doxyfile 1.5.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = DRAMSimII
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = .99.14b
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = docs
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek,
+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish,
+# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene,
+# Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class " \
+ "The $name widget " \
+ "The $name file " \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses.
+# With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this tag.
+# The format is ext=language, where ext is a file extension, and language is one of
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C
+
+EXTENSION_MAPPING =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page. This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command , where is the value of
+# the FILE_VERSION_FILTER tag, and is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+# doxygen. The layout file controls the global structure of the generated output files
+# in an output format independent way. The create the layout file that represents
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name
+# of the layout file.
+
+LAYOUT_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = src
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.d \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.py \
+ *.f90
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command , where
+# is the value of the INPUT_FILTER tag, and is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
+# For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
+# Qt Help Project / Custom Filters.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
+# filter section matches.
+# Qt Help Project / Filter Attributes.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to FRAME, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature. Other possible values
+# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list;
+# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
+# disables this behavior completely. For backwards compatibility with previous
+# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
+# respectively.
+
+GENERATE_TREEVIEW = HIERARCHIES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 1000
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Options related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/README
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/README Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,4 @@
+to install DRAMsimII as a module for M5
+1. make sure the DRAMSimII directory is in /src/mem/ or somewhere similar, M5 searches the src subdir for SConscript files to locate add-on modules
+to run M5 with DRAMsimII as the memory system
+2. dramsim.py is copied to /configs/examples/ as there are other files in this path that this script depends on
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/GemsFDTD.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/GemsFDTD.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd /benchmarks/459.GemsFDTD/data/test/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/459.GemsFDTD/exe/GemsFDTD_base.alpha-gcc410-glibc236
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the blackscholes benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./blackscholes 4 /parsec/install/inputs/blackscholes/in_16.txt /parsec/install/inputs/blackscholes/prices.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the blackscholes benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./blackscholes 4 /parsec/install/inputs/blackscholes/in_64K.txt /parsec/install/inputs/blackscholes/prices.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the blackscholes benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./blackscholes 4 /parsec/install/inputs/blackscholes/in_16K.txt /parsec/install/inputs/blackscholes/prices.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the blackscholes benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./blackscholes 4 /parsec/install/inputs/blackscholes/in_4K.txt /parsec/install/inputs/blackscholes/prices.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/blackscholes_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the blackscholes benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./blackscholes 4 /parsec/install/inputs/blackscholes/in_4.txt /parsec/install/inputs/blackscholes/prices.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the bodytrack benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./bodytrack /parsec/install/inputs/bodytrack/sequenceB_1 4 1 100 3 0 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the bodytrack benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./bodytrack /parsec/install/inputs/bodytrack/sequenceB_4 4 4 4000 5 0 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the bodytrack benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./bodytrack /parsec/install/inputs/bodytrack/sequenceB_2 4 2 2000 5 0 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the bodytrack benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./bodytrack /parsec/install/inputs/bodytrack/sequenceB_1 4 1 1000 5 0 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/bodytrack_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the bodytrack benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./bodytrack /parsec/install/inputs/bodytrack/sequenceB_1 4 1 5 1 0 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/bzip2.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/bzip2.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cd /benchmarks/401.bzip2/data/all/input
+echo bzip2
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/401.bzip2/exe/bzip2_base.alpha-gcc410-glibc236 input.combined 1\
+echo Done.
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/cactusADM.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/cactusADM.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd /benchmarks/436.cactusADM/data/test/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/436.cactusADM/exe/cactusADM_base.alpha-gcc410-glibc236 benchADM.par
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/calculix.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/calculix.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+cd /benchmarks/454.calculix/data/train/input
+echo Calculix
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+
+#/benchmarks/454.calculix/exe/calculix_base.alpha-gcc410-glibc236 -i beampic
+/benchmarks/454.calculix/exe/calculix_base.alpha-gcc410-glibc236 -i stairs
+echo Done.
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/calculix_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/calculix_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+cd /benchmarks/454.calculix/data/train/input
+echo Calculix
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/454.calculix/exe/calculix_base.alpha-gcc410-glibc236 -i stairs&
+ i=$(($i-1))
+done
+wait
+#/benchmarks/454.calculix/exe/calculix_base.alpha-gcc410-glibc236 -i beampic
+
+echo Done.
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the canneal benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./canneal 4 100 300 /parsec/install/inputs/canneal/100.nets 2
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the canneal benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./canneal 4 15000 2000 /parsec/install/inputs/canneal/400000.nets 128
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the canneal benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./canneal 4 15000 2000 /parsec/install/inputs/canneal/200000.nets 64
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the canneal benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./canneal 4 10000 2000 /parsec/install/inputs/canneal/100000.nets 32
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/canneal_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the canneal benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./canneal 4 5 100 /parsec/install/inputs/canneal/10.nets 1
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/dealII.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/dealII.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/447.dealII/exe/dealII_base.alpha-gcc410-glibc236 8
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/dealII_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/dealII_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/447.dealII/exe/dealII_base.alpha-gcc410-glibc236 8&
+ i=$(($i-1))
+done
+wait
+
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the dedup benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./dedup -c -p -f -t 4 -i /parsec/install/inputs/dedup/hamlet.dat -o /parsec/install/inputs/dedup/output.dat.ddp
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the dedup benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./dedup -c -p -f -t 4 -i /parsec/install/inputs/dedup/medial.dat -o /parsec/install/inputs/dedup/output.dat.ddp
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the dedup benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./dedup -c -p -f -t 4 -i /parsec/install/inputs/dedup/mediam.dat -o /parsec/install/inputs/dedup/output.dat.ddp
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the dedup benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./dedup -c -p -f -t 4 -i /parsec/install/inputs/dedup/medias.dat -o /parsec/install/inputs/dedup/output.dat.ddp
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/dedup_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the dedup benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./dedup -c -p -f -t 4 -i /parsec/install/inputs/dedup/test.dat -o /parsec/install/inputs/dedup/output.dat.ddp
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the facesim benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./facesim -timing -threads 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the facesim benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./facesim -timing -threads 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the facesim benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./facesim -timing -threads 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the facesim benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./facesim -timing -threads 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/facesim_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the facesim benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./facesim -h
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the ferret benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./ferret /parsec/install/inputs/ferret/coreld lsh /parsec/install/inputs/ferret/queriesd 5 5 4 /parsec/install/inputs/ferret/output.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the ferret benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./ferret /parsec/install/inputs/ferret/corell lsh /parsec/install/inputs/ferret/queriesl 10 20 4 /parsec/install/inputs/ferret/output.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the ferret benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./ferret /parsec/install/inputs/ferret/corelm lsh /parsec/install/inputs/ferret/queriesm 10 20 4 /parsec/install/inputs/ferret/output.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the ferret benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./ferret /parsec/install/inputs/ferret/corels lsh /parsec/install/inputs/ferret/queriess 10 20 4 /parsec/install/inputs/ferret/output.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/ferret_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the ferret benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./ferret /parsec/install/inputs/ferret/corelt lsh /parsec/install/inputs/ferret/queriest 1 1 4 /parsec/install/inputs/ferret/output.txt
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the fluidanimate benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./fluidanimate 4 3 /parsec/install/inputs/fluidanimate/in_15K.fluid /parsec/install/inputs/fluidanimate/out.fluid
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the fluidanimate benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./fluidanimate 4 5 /parsec/install/inputs/fluidanimate/in_300K.fluid /parsec/install/inputs/fluidanimate/out.fluid
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the fluidanimate benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./fluidanimate 4 5 /parsec/install/inputs/fluidanimate/in_100K.fluid /parsec/install/inputs/fluidanimate/out.fluid
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the fluidanimate benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./fluidanimate 4 5 /parsec/install/inputs/fluidanimate/in_35K.fluid /parsec/install/inputs/fluidanimate/out.fluid
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/fluidanimate_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the fluidanimate benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./fluidanimate 4 1 /parsec/install/inputs/fluidanimate/in_5K.fluid /parsec/install/inputs/fluidanimate/out.fluid
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the freqmine benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./freqmine /parsec/install/inputs/freqmine/T10I4D100K_1k.dat 3
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the freqmine benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./freqmine /parsec/install/inputs/freqmine/kosarak_990k.dat 790
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the freqmine benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./freqmine /parsec/install/inputs/freqmine/kosarak_500k.dat 410
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the freqmine benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./freqmine /parsec/install/inputs/freqmine/kosarak_250k.dat 220
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/freqmine_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the freqmine benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./freqmine /parsec/install/inputs/freqmine/T10I4D100K_3.dat 1
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/gobmk.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/gobmk.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd /benchmarks/445.gobmk/data/all/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/445.gobmk/exe/gobmk_base.alpha-gcc410-glibc236 --quiet --mode gtp < /benchmarks/445.gobmk/data/test/input/connection.tst
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/gobmk_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/gobmk_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+cd /benchmarks/445.gobmk/data/all/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/445.gobmk/exe/gobmk_base.alpha-gcc410-glibc236 --quiet --mode gtp < /benchmarks/445.gobmk/data/test/input/connection.tst&
+ i=$(($i-1))
+done
+wait
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/lbm.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/lbm.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cd /benchmarks/470.lbm/data/test/input
+echo "LBM Test"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/470.lbm/exe/lbm_base.alpha-gcc410-glibc236 5 reference.dat 0 1 100_100_130_cf_a.of
+echo "LBM Done"
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/lbmLong.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/lbmLong.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cd /benchmarks/470.lbm/data/ref/input
+echo "LBM Ref"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/470.lbm/exe/lbm_base.alpha-gcc410-glibc236 5 reference.dat 0 1 100_100_130_ldc.of
+echo "LBM Ref done"
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/libquantum.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/libquantum.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd /benchmarks/462.libquantum
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/462.libquantum/exe/libquantum_base.alpha-gcc410-glibc236 129 5
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/mcf.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/mcf.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+echo "MCF Test"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/429.mcf/exe/mcf_base.alpha-gcc410-glibc236 /benchmarks/429.mcf/data/test/input/inp.in
+echo Done.
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/mcfLong.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/mcfLong.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+echo "MCF Ref"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/429.mcf/exe/mcf_base.alpha-gcc410-glibc236 /benchmarks/429.mcf/data/ref/input/inp.in
+echo "MCF Ref done"
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/mcf_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/mcf_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+echo "MCF Test"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/429.mcf/exe/mcf_base.alpha-gcc410-glibc236 /benchmarks/429.mcf/data/test/input/inp.in&
+ i=$(($i-1))
+done
+wait
+
+echo Done.
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/milc.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/milc.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cd /benchmarks/433.milc/data/test/input
+echo "MILC Test"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/433.milc/exe/milc_base.alpha-gcc410-glibc236 < su3imp.in
+echo done
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/milcLong.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/milcLong.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cd /benchmarks/433.milc/data/ref/input
+echo "MILC Ref"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/433.milc/exe/milc_base.alpha-gcc410-glibc236 < su3imp.in
+echo "MILC Ref done"
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/milc_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/milc_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+cd /benchmarks/433.milc/data/test/input
+echo "MILC Test"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/433.milc/exe/milc.alpha < su3imp.in&
+ i=$(($i-1))
+done
+wait
+
+echo done
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/namd.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/namd.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd /benchmarks/444.namd/data/all/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/444.namd/exe/namd_base.alpha-gcc410-glibc236 --input namd.input --iterations 1 --output namd.out
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/omnetpp.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/omnetpp.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd /benchmarks/471.omnetpp/data/ref/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/471.omnetpp/exe/omnetpp_base.alpha-gcc410-glibc236 omnetpp.ini
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/povray.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/povray.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd /benchmarks/453.povray/data/all/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/453.povray/exe/povray_base.alpha-gcc410-glibc236 /benchmarks/453.povray/data/ref/input/SPEC-benchmark-ref.ini
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/povray_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/povray_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+cd /benchmarks/453.povray/data/all/input
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/453.povray/exe/povray_base.alpha-gcc410-glibc236 /benchmarks/453.povray/data/ref/input/SPEC-benchmark-ref.ini&
+ i=$(($i-1))
+done
+wait
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the rtview benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./rtview /parsec/install/inputs/rtview/bunny.obj -nodisplay -automove -nthreads 4 -frames 1 -res 16 16
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the rtview benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./rtview /parsec/install/inputs/rtview/happy_buddha.obj -nodisplay -automove -nthreads 4 -frames 3 -res 1920 1080
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the rtview benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./rtview /parsec/install/inputs/rtview/happy_buddha.obj -nodisplay -automove -nthreads 4 -frames 3 -res 960 540
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the rtview benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./rtview /parsec/install/inputs/rtview/happy_buddha.obj -nodisplay -automove -nthreads 4 -frames 3 -res 480 270
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/rtview_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the rtview benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./rtview /parsec/install/inputs/rtview/octahedron.obj -nodisplay -automove -nthreads 4 -frames 1 -res 1 1
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/sjeng.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/sjeng.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+#cd /benchmarks/458.sjeng/data/test/input
+echo sjeng
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/458.sjeng/exe/sjeng_base.alpha-gcc410-glibc236 /benchmarks/458.sjeng/data/test/input/test.txt
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/sjeng_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/sjeng_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+#cd /benchmarks/458.sjeng/data/test/input
+echo sjeng
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/458.sjeng/exe/sjeng_base.alpha-gcc410-glibc236 /benchmarks/458.sjeng/data/test/input/test.txt&
+ i=$(($i-1))
+done
+wait
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/soplex.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/soplex.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+#cd /benchmarks/450.soplex/data/ref/input
+echo SOPLEX
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/450.soplex/exe/soplex_base.alpha-gcc410-glibc236 -m10000 /benchmarks/450.soplex/data/ref/input/ref.mps
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/stream.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/stream.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/stream-short-opt.bak
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/stream_4.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/stream_4.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+i=4
+while [ $i -gt 0 ]
+do
+ /benchmarks/stream-short-opt.bak&
+ i=$(($i-1))
+done
+wait
+
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the streamcluster benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./streamcluster 3 10 3 16 16 10 none /parsec/install/inputs/streamcluster/output.txt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the streamcluster benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./streamcluster 10 20 128 16384 16384 1000 none /parsec/install/inputs/streamcluster/output.txt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the streamcluster benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./streamcluster 10 20 64 8192 8192 1000 none /parsec/install/inputs/streamcluster/output.txt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the streamcluster benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./streamcluster 10 20 32 4096 4096 1000 none /parsec/install/inputs/streamcluster/output.txt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/streamcluster_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the streamcluster benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./streamcluster 2 5 1 10 10 5 none /parsec/install/inputs/streamcluster/output.txt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the swaptions benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./swaptions -ns 3 -sm 50 -nt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the swaptions benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./swaptions -ns 64 -sm 20000 -nt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the swaptions benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./swaptions -ns 32 -sm 10000 -nt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the swaptions benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./swaptions -ns 16 -sm 5000 -nt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/swaptions_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the swaptions benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./swaptions -ns 1 -sm 5 -nt 4
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# File to run the vips benchmark
+
+export IM_CONCURRENCY=4
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./vips im_benchmark /parsec/install/inputs/vips/barbados_256x288.v /parsec/install/inputs/vips/output.v
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# File to run the vips benchmark
+
+export IM_CONCURRENCY=4
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./vips im_benchmark /parsec/install/inputs/vips/bigben_2662x5500.v /parsec/install/inputs/vips/output.v
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# File to run the vips benchmark
+
+export IM_CONCURRENCY=4
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./vips im_benchmark /parsec/install/inputs/vips/vulture_2336x2336.v /parsec/install/inputs/vips/output.v
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/vips_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# File to run the vips benchmark
+
+export IM_CONCURRENCY=4
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./vips im_benchmark /parsec/install/inputs/vips/pomegranate_1600x1200.v /parsec/install/inputs/vips/output.v
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/vips_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/vips_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# File to run the vips benchmark
+
+export IM_CONCURRENCY=4
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./vips im_benchmark /parsec/install/inputs/vips/barbados_256x288.v /parsec/install/inputs/vips/output.v
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simdev.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simdev.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the x264 benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./x264 --quiet --qp 20 --partitions b8x8,i4x4 --ref 5 --direct auto --b-pyramid --weightb --mixed-refs --no-fast-pskip --me umh --subme 7 --analyse b8x8,i4x4 --threads 4 -o /parsec/install/inputs/x264/eledream.264 /parsec/install/inputs/x264/eledream_64x36_3.y4m
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simlarge.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simlarge.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the x264 benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./x264 --quiet --qp 20 --partitions b8x8,i4x4 --ref 5 --direct auto --b-pyramid --weightb --mixed-refs --no-fast-pskip --me umh --subme 7 --analyse b8x8,i4x4 --threads 4 -o /parsec/install/inputs/x264/eledream.264 /parsec/install/inputs/x264/eledream_640x360_128.y4m
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simmedium.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simmedium.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the x264 benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./x264 --quiet --qp 20 --partitions b8x8,i4x4 --ref 5 --direct auto --b-pyramid --weightb --mixed-refs --no-fast-pskip --me umh --subme 7 --analyse b8x8,i4x4 --threads 4 -o /parsec/install/inputs/x264/eledream.264 /parsec/install/inputs/x264/eledream_640x360_32.y4m
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simsmall.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/x264_4c_simsmall.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the x264 benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./x264 --quiet --qp 20 --partitions b8x8,i4x4 --ref 5 --direct auto --b-pyramid --weightb --mixed-refs --no-fast-pskip --me umh --subme 7 --analyse b8x8,i4x4 --threads 4 -o /parsec/install/inputs/x264/eledream.264 /parsec/install/inputs/x264/eledream_640x360_8.y4m
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/x264_4c_test.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/x264_4c_test.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# File to run the x264 benchmark
+
+cd /parsec/install/bin
+/sbin/m5 switchcpu
+/sbin/m5 dumpstats
+/sbin/m5 resetstats
+./x264 --quiet --qp 20 --partitions b8x8,i4x4 --ref 5 --direct auto --b-pyramid --weightb --mixed-refs --no-fast-pskip --me umh --subme 7 --analyse b8x8,i4x4 --threads 4 -o /parsec/install/inputs/x264/eledream.264 /parsec/install/inputs/x264/eledream_32x18_1.y4m
+echo "Done :D"
+/sbin/m5 exit
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/xalancbmk.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/xalancbmk.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+cd /benchmarks/483.xalancbmk/data/test/input
+#cd /benchmarks/483.xalancbmk/data/train/input
+echo "Xalan Test"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/483.xalancbmk/exe/Xalan_base.alpha-gcc410-glibc236 -v test.xml xalanc.xsl
+#/benchmarks/483.xalancbmk/exe/Xalan_base.alpha-gcc410-glibc236 -v allbooks.xml xalanc.xsl > /dev/null
+echo Done.
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/boot/xalancbmkLong.rcS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/boot/xalancbmkLong.rcS Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cd /benchmarks/483.xalancbmk/data/ref/input
+echo "Xalan Ref"
+/sbin/m5 resetstats
+/sbin/m5 switchcpu
+/benchmarks/483.xalancbmk/exe/Xalan_base.alpha-gcc410-glibc236 -v t5.xml xalanc.xsl
+echo "Xalan Ref done"
+/sbin/m5 exit
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/Benchmarks.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/Benchmarks.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,111 @@
+# Copyright (c) 2006-2007 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.
+#
+# Authors: Ali Saidi
+
+from SysPaths import *
+
+class SysConfig:
+ def __init__(self, script=None, mem=None, disk=None):
+ self.scriptname = script
+ self.diskname = disk
+ self.memsize = mem
+
+ def script(self):
+ if self.scriptname:
+ return script(self.scriptname)
+ else:
+ return ''
+
+ def mem(self):
+ if self.memsize:
+ return self.memsize
+ else:
+ return '128MB'
+
+ def disk(self):
+ if self.diskname:
+ return disk(self.diskname)
+ else:
+ return env.get('LINUX_IMAGE', disk('linux-latest.img'))
+
+# Benchmarks are defined as a key in a dict which is a list of SysConfigs
+# The first defined machine is the test system, the others are driving systems
+
+Benchmarks = {
+ 'PovrayBench': [SysConfig('povray-bench.rcS', '512MB', 'povray.img')],
+ 'PovrayAutumn': [SysConfig('povray-autumn.rcS', '512MB', 'povray.img')],
+
+ 'NetperfStream': [SysConfig('netperf-stream-client.rcS'),
+ SysConfig('netperf-server.rcS')],
+ 'NetperfStreamUdp': [SysConfig('netperf-stream-udp-client.rcS'),
+ SysConfig('netperf-server.rcS')],
+ 'NetperfUdpLocal': [SysConfig('netperf-stream-udp-local.rcS')],
+ 'NetperfStreamNT': [SysConfig('netperf-stream-nt-client.rcS'),
+ SysConfig('netperf-server.rcS')],
+ 'NetperfMaerts': [SysConfig('netperf-maerts-client.rcS'),
+ SysConfig('netperf-server.rcS')],
+ 'SurgeStandard': [SysConfig('surge-server.rcS', '512MB'),
+ SysConfig('surge-client.rcS', '256MB')],
+ 'SurgeSpecweb': [SysConfig('spec-surge-server.rcS', '512MB'),
+ SysConfig('spec-surge-client.rcS', '256MB')],
+ 'Nhfsstone': [SysConfig('nfs-server-nhfsstone.rcS', '512MB'),
+ SysConfig('nfs-client-nhfsstone.rcS')],
+ 'Nfs': [SysConfig('nfs-server.rcS', '900MB'),
+ SysConfig('nfs-client-dbench.rcS')],
+ 'NfsTcp': [SysConfig('nfs-server.rcS', '900MB'),
+ SysConfig('nfs-client-tcp.rcS')],
+ 'IScsiInitiator': [SysConfig('iscsi-client.rcS', '512MB'),
+ SysConfig('iscsi-server.rcS', '512MB')],
+ 'IScsiTarget': [SysConfig('iscsi-server.rcS', '512MB'),
+ SysConfig('iscsi-client.rcS', '512MB')],
+ 'Validation': [SysConfig('iscsi-server.rcS', '512MB'),
+ SysConfig('iscsi-client.rcS', '512MB')],
+ 'Ping': [SysConfig('ping-server.rcS',),
+ SysConfig('ping-client.rcS')],
+
+ 'ValAccDelay': [SysConfig('devtime.rcS', '512MB')],
+ 'ValAccDelay2': [SysConfig('devtimewmr.rcS', '512MB')],
+ 'ValMemLat': [SysConfig('micro_memlat.rcS', '512MB')],
+ 'ValMemLat2MB': [SysConfig('micro_memlat2mb.rcS', '512MB')],
+ 'ValMemLat8MB': [SysConfig('micro_memlat8mb.rcS', '512MB')],
+ 'ValMemLat': [SysConfig('micro_memlat8.rcS', '512MB')],
+ 'ValTlbLat': [SysConfig('micro_tlblat.rcS', '512MB')],
+ 'ValSysLat': [SysConfig('micro_syscall.rcS', '512MB')],
+ 'ValCtxLat': [SysConfig('micro_ctx.rcS', '512MB')],
+ 'ValStream': [SysConfig('micro_stream.rcS', '512MB')],
+ 'ValStreamScale': [SysConfig('micro_streamscale.rcS', '512MB')],
+ 'ValStreamCopy': [SysConfig('micro_streamcopy.rcS', '512MB')],
+
+ 'MutexTest': [SysConfig('mutex-test.rcS', '128MB')],
+
+ 'bnAn': [SysConfig('/z/saidi/work/m5.newmem.head/configs/boot/bn-app.rcS',
+ '128MB', '/z/saidi/work/bottleneck/bnimg.img')]
+}
+
+benchs = Benchmarks.keys()
+benchs.sort()
+DefinedBenchmarks = ", ".join(benchs)
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/CacheConfig.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/CacheConfig.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,65 @@
+# Copyright (c) 2010 Advanced Micro Devices, Inc.
+# 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.
+#
+# Authors: Lisa Hsu
+
+# Configure the M5 cache hierarchy config in one place
+#
+
+import m5
+from m5.objects import *
+from Caches import *
+
+def config_cache(options, system):
+ if options.l2cache:
+ system.l2cache = L2Cache(size='2MB')
+ system.tol2bus = Bus()
+ system.l2cache.cpu_side = system.tol2bus.port
+ system.l2cache.mem_side = system.membus.port
+ system.l2cache.num_cpus = options.num_cpus
+
+ elif options.l3cache:
+ system.l3cache = L3Cache()
+ system.tol3bus = Bus()
+ system.l3cache.cpu_side = system.tol3bus.port
+ system.l3cache.mem_side = system.membus.port
+ system.l3cache.num_cpus = options.num_cpus
+
+ for i in xrange(options.num_cpus):
+ if options.l1cache:
+ system.cpu[i].addPrivateSplitL1Caches(L1Cache(), L1Cache())
+ system.cpu[i].connectMemPorts(system.membus)
+
+ elif options.l2cache:
+ system.cpu[i].addPrivateSplitL1Caches(L1Cache(), L1Cache())
+ system.cpu[i].connectMemPorts(system.tol2bus)
+
+ elif options.l3cache:
+ system.cpu[i].addTwoLevelCacheHierarchy(L1Cache(), L1Cache(), L2Cache())
+ system.cpu[i].connectMemPorts(system.tol3bus)
+
+
+ return system
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/Caches.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/Caches.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,69 @@
+# Copyright (c) 2006-2007 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.
+#
+# Authors: Lisa Hsu
+
+from m5.objects import *
+
+class L1Cache(BaseCache):
+ size = '32kB'
+ assoc = 4
+ block_size = 64
+ latency = '.9375ns'
+ num_cpus = 1
+ mshrs = 10
+ tgts_per_mshr = 5
+
+class L2Cache(BaseCache):
+ size = '256kB'
+ assoc = 8
+ block_size = 64
+ latency = '3.4375ns'
+ num_cpus = 1
+ mshrs = 20
+ tgts_per_mshr = 12
+
+class L3Cache(BaseCache):
+ size = '8MB'
+ assoc = 16
+ block_size = 64
+ latency = '12.25ns'
+ num_cpus = 4
+ mshrs = 24
+ tgts_per_mshr = 12
+ prefetch_policy='ghb'
+ prefetch_degree=3
+ prefetcher_size=256
+
+
+class IOCache(BaseCache):
+ assoc = 8
+ block_size = 64
+ latency = '10ns'
+ mshrs = 20
+ size = '1kB'
+ tgts_per_mshr = 12
+ forward_snoops = False
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/FSConfig.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/FSConfig.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,465 @@
+# Copyright (c) 2006-2008 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.
+#
+# Authors: Kevin Lim
+
+from m5.objects import *
+from Benchmarks import *
+
+class CowIdeDisk(IdeDisk):
+ image = CowDiskImage(child=RawDiskImage(read_only=True),
+ read_only=False)
+
+ def childImage(self, ci):
+ self.image.child.image_file = ci
+
+class MemBus(Bus):
+ badaddr_responder = BadAddr()
+ default = Self.badaddr_responder.pio
+
+def makeDramSimLinuxAlphaSystem(mem_mode, mdesc=None, extraParameters="", settingsFilename="", benchmarkName=None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+ self = LinuxAlphaSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1, clock='3333MHz')
+ self.bridge = Bridge(delay='5ns', nack_delay='1ns')
+
+ if mdesc.scriptname != None:
+ outFile = mdesc.scriptname.split('.')[0]
+ elif benchmarkName != None:
+ outFile = benchmarkName
+ else:
+ outFile = ''
+
+ self.physmem = M5dramSystem(range=AddrRange(mdesc.mem()))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.iobus)
+ self.tsunami.ide.pio = self.iobus.port
+ self.tsunami.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+
+def makeLinuxAlphaSystem(mem_mode, mdesc = None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+
+ self = LinuxAlphaSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.iobus)
+ self.tsunami.ide.pio = self.iobus.port
+ self.tsunami.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
+ read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+def makeLinuxAlphaRubySystem(mem_mode, mdesc = None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+
+ physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ self = LinuxAlphaSystem(physmem = physmem)
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+
+ # Create pio bus to connect all device pio ports to rubymem's pio port
+ self.piobus = Bus(bus_id=0)
+
+ #
+ # Pio functional accesses from devices need direct access to memory
+ # RubyPort currently does support functional accesses. Therefore provide
+ # the piobus a direct connection to physical memory
+ #
+ self.piobus.port = physmem.port
+
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.piobus)
+ self.tsunami.ide.pio = self.piobus.port
+ self.tsunami.ethernet.pio = self.piobus.port
+
+ #
+ # store the dma devices for later connection to dma ruby ports
+ #
+ self.dma_devices = [self.tsunami.ide, self.tsunami.ethernet]
+
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
+ read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+def makeSparcSystem(mem_mode, mdesc = None):
+ class CowMmDisk(MmDisk):
+ image = CowDiskImage(child=RawDiskImage(read_only=True),
+ read_only=False)
+
+ def childImage(self, ci):
+ self.image.child.image_file = ci
+
+ self = SparcSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.t1000 = T1000()
+ self.t1000.attachOnChipIO(self.membus)
+ self.t1000.attachIO(self.iobus)
+ self.physmem = PhysicalMemory(range = AddrRange(Addr('1MB'), size = '64MB'), zero = True)
+ self.physmem2 = PhysicalMemory(range = AddrRange(Addr('2GB'), size ='256MB'), zero = True)
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.physmem2.port = self.membus.port
+ self.rom.port = self.membus.port
+ self.nvram.port = self.membus.port
+ self.hypervisor_desc.port = self.membus.port
+ self.partition_desc.port = self.membus.port
+ self.intrctrl = IntrControl()
+ self.disk0 = CowMmDisk()
+ self.disk0.childImage(disk('disk.s10hw2'))
+ self.disk0.pio = self.iobus.port
+ self.reset_bin = binary('reset_new.bin')
+ self.hypervisor_bin = binary('q_new.bin')
+ self.openboot_bin = binary('openboot_new.bin')
+ self.nvram_bin = binary('nvram1')
+ self.hypervisor_desc_bin = binary('1up-hv.bin')
+ self.partition_desc_bin = binary('1up-md.bin')
+
+ return self
+
+def makeLinuxMipsSystem(mem_mode, mdesc = None):
+ class BaseMalta(Malta):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+
+ self = LinuxMipsSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.physmem = PhysicalMemory(range = AddrRange('1GB'))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.malta = BaseMalta()
+ self.malta.attachIO(self.iobus)
+ self.malta.ide.pio = self.iobus.port
+ self.malta.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
+ read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('mips/vmlinux')
+ self.console = binary('mips/console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+def x86IOAddress(port):
+ IO_address_space_base = 0x8000000000000000
+ return IO_address_space_base + port;
+
+def makeX86System(mem_mode, numCPUs = 1, mdesc = None, self = None):
+ if self == None:
+ self = X86System()
+
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ mdesc.diskname = 'x86root.img'
+ self.readfile = mdesc.script()
+
+ self.mem_mode = mem_mode
+
+ # Physical memory
+ self.membus = MemBus(bus_id=1)
+ self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ self.physmem.port = self.membus.port
+
+ # North Bridge
+ self.iobus = Bus(bus_id=0)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+
+ # Platform
+ self.pc = Pc()
+ self.pc.attachIO(self.iobus)
+
+ self.intrctrl = IntrControl()
+
+ # Disks
+ disk0 = CowIdeDisk(driveID='master')
+ disk2 = CowIdeDisk(driveID='master')
+ disk0.childImage(mdesc.disk())
+ disk2.childImage(disk('linux-bigswap2.img'))
+ self.pc.south_bridge.ide.disks = [disk0, disk2]
+
+ # Add in a Bios information structure.
+ structures = [X86SMBiosBiosInformation()]
+ self.smbios_table.structures = structures
+
+ # Set up the Intel MP table
+ for i in xrange(numCPUs):
+ bp = X86IntelMPProcessor(
+ local_apic_id = i,
+ local_apic_version = 0x14,
+ enable = True,
+ bootstrap = (i == 0))
+ self.intel_mp_table.add_entry(bp)
+ io_apic = X86IntelMPIOAPIC(
+ id = numCPUs,
+ version = 0x11,
+ enable = True,
+ address = 0xfec00000)
+ self.pc.south_bridge.io_apic.apic_id = io_apic.id
+ self.intel_mp_table.add_entry(io_apic)
+ isa_bus = X86IntelMPBus(bus_id = 0, bus_type='ISA')
+ self.intel_mp_table.add_entry(isa_bus)
+ pci_bus = X86IntelMPBus(bus_id = 1, bus_type='PCI')
+ self.intel_mp_table.add_entry(pci_bus)
+ connect_busses = X86IntelMPBusHierarchy(bus_id=0,
+ subtractive_decode=True, parent_bus=1)
+ self.intel_mp_table.add_entry(connect_busses)
+ pci_dev4_inta = X86IntelMPIOIntAssignment(
+ interrupt_type = 'INT',
+ polarity = 'ConformPolarity',
+ trigger = 'ConformTrigger',
+ source_bus_id = 1,
+ source_bus_irq = 0 + (4 << 2),
+ dest_io_apic_id = io_apic.id,
+ dest_io_apic_intin = 16)
+ self.intel_mp_table.add_entry(pci_dev4_inta);
+ def assignISAInt(irq, apicPin):
+ assign_8259_to_apic = X86IntelMPIOIntAssignment(
+ interrupt_type = 'ExtInt',
+ polarity = 'ConformPolarity',
+ trigger = 'ConformTrigger',
+ source_bus_id = 0,
+ source_bus_irq = irq,
+ dest_io_apic_id = io_apic.id,
+ dest_io_apic_intin = 0)
+ self.intel_mp_table.add_entry(assign_8259_to_apic)
+ assign_to_apic = X86IntelMPIOIntAssignment(
+ interrupt_type = 'INT',
+ polarity = 'ConformPolarity',
+ trigger = 'ConformTrigger',
+ source_bus_id = 0,
+ source_bus_irq = irq,
+ dest_io_apic_id = io_apic.id,
+ dest_io_apic_intin = apicPin)
+ self.intel_mp_table.add_entry(assign_to_apic)
+ assignISAInt(0, 2)
+ assignISAInt(1, 1)
+ for i in range(3, 15):
+ assignISAInt(i, i)
+
+
+def makeLinuxX86System(mem_mode, numCPUs = 1, mdesc = None):
+ self = LinuxX86System()
+
+ # Build up a generic x86 system and then specialize it for Linux
+ makeX86System(mem_mode, numCPUs, mdesc, self)
+
+ # We assume below that there's at least 1MB of memory. We'll require 2
+ # just to avoid corner cases.
+ assert(self.physmem.range.second.getValue() >= 0x200000)
+
+ # Mark the first megabyte of memory as reserved
+ self.e820_table.entries.append(X86E820Entry(
+ addr = 0,
+ size = '1MB',
+ range_type = 2))
+
+ # Mark the rest as available
+ self.e820_table.entries.append(X86E820Entry(
+ addr = 0x100000,
+ size = '%dB' % (self.physmem.range.second - 0x100000 + 1),
+ range_type = 1))
+
+ # Command line
+ self.boot_osflags = 'earlyprintk=ttyS0 console=ttyS0 lpj=7999923 ' + \
+ 'root=/dev/hda1'
+ return self
+
+
+def makeDualRoot(testSystem, driveSystem, dumpfile):
+ self = Root()
+ self.testsys = testSystem
+ self.drivesys = driveSystem
+ self.etherlink = EtherLink()
+ self.etherlink.int0 = Parent.testsys.tsunami.ethernet.interface
+ self.etherlink.int1 = Parent.drivesys.tsunami.ethernet.interface
+
+ if dumpfile:
+ self.etherdump = EtherDump(file=dumpfile)
+ self.etherlink.dump = Parent.etherdump
+
+ return self
+
+def setMipsOptions(TestCPUClass):
+ #CP0 Configuration
+ TestCPUClass.CoreParams.CP0_PRId_CompanyOptions = 0
+ TestCPUClass.CoreParams.CP0_PRId_CompanyID = 1
+ TestCPUClass.CoreParams.CP0_PRId_ProcessorID = 147
+ TestCPUClass.CoreParams.CP0_PRId_Revision = 0
+
+ #CP0 Interrupt Control
+ TestCPUClass.CoreParams.CP0_IntCtl_IPTI = 7
+ TestCPUClass.CoreParams.CP0_IntCtl_IPPCI = 7
+
+ # Config Register
+ #TestCPUClass.CoreParams.CP0_Config_K23 = 0 # Since TLB
+ #TestCPUClass.CoreParams.CP0_Config_KU = 0 # Since TLB
+ TestCPUClass.CoreParams.CP0_Config_BE = 0 # Little Endian
+ TestCPUClass.CoreParams.CP0_Config_AR = 1 # Architecture Revision 2
+ TestCPUClass.CoreParams.CP0_Config_AT = 0 # MIPS32
+ TestCPUClass.CoreParams.CP0_Config_MT = 1 # TLB MMU
+ #TestCPUClass.CoreParams.CP0_Config_K0 = 2 # Uncached
+
+ #Config 1 Register
+ TestCPUClass.CoreParams.CP0_Config1_M = 1 # Config2 Implemented
+ TestCPUClass.CoreParams.CP0_Config1_MMU = 63 # TLB Size
+ # ***VERY IMPORTANT***
+ # Remember to modify CP0_Config1 according to cache specs
+ # Examine file ../common/Cache.py
+ TestCPUClass.CoreParams.CP0_Config1_IS = 1 # I-Cache Sets Per Way, 16KB cache, i.e., 1 (128)
+ TestCPUClass.CoreParams.CP0_Config1_IL = 5 # I-Cache Line Size, default in Cache.py is 64, i.e 5
+ TestCPUClass.CoreParams.CP0_Config1_IA = 1 # I-Cache Associativity, default in Cache.py is 2, i.e, a value of 1
+ TestCPUClass.CoreParams.CP0_Config1_DS = 2 # D-Cache Sets Per Way (see below), 32KB cache, i.e., 2
+ TestCPUClass.CoreParams.CP0_Config1_DL = 5 # D-Cache Line Size, default is 64, i.e., 5
+ TestCPUClass.CoreParams.CP0_Config1_DA = 1 # D-Cache Associativity, default is 2, i.e. 1
+ TestCPUClass.CoreParams.CP0_Config1_C2 = 0 # Coprocessor 2 not implemented(?)
+ TestCPUClass.CoreParams.CP0_Config1_MD = 0 # MDMX ASE not implemented in Mips32
+ TestCPUClass.CoreParams.CP0_Config1_PC = 1 # Performance Counters Implemented
+ TestCPUClass.CoreParams.CP0_Config1_WR = 0 # Watch Registers Implemented
+ TestCPUClass.CoreParams.CP0_Config1_CA = 0 # Mips16e NOT implemented
+ TestCPUClass.CoreParams.CP0_Config1_EP = 0 # EJTag Not Implemented
+ TestCPUClass.CoreParams.CP0_Config1_FP = 0 # FPU Implemented
+
+ #Config 2 Register
+ TestCPUClass.CoreParams.CP0_Config2_M = 1 # Config3 Implemented
+ TestCPUClass.CoreParams.CP0_Config2_TU = 0 # Tertiary Cache Control
+ TestCPUClass.CoreParams.CP0_Config2_TS = 0 # Tertiary Cache Sets Per Way
+ TestCPUClass.CoreParams.CP0_Config2_TL = 0 # Tertiary Cache Line Size
+ TestCPUClass.CoreParams.CP0_Config2_TA = 0 # Tertiary Cache Associativity
+ TestCPUClass.CoreParams.CP0_Config2_SU = 0 # Secondary Cache Control
+ TestCPUClass.CoreParams.CP0_Config2_SS = 0 # Secondary Cache Sets Per Way
+ TestCPUClass.CoreParams.CP0_Config2_SL = 0 # Secondary Cache Line Size
+ TestCPUClass.CoreParams.CP0_Config2_SA = 0 # Secondary Cache Associativity
+
+
+ #Config 3 Register
+ TestCPUClass.CoreParams.CP0_Config3_M = 0 # Config4 Not Implemented
+ TestCPUClass.CoreParams.CP0_Config3_DSPP = 1 # DSP ASE Present
+ TestCPUClass.CoreParams.CP0_Config3_LPA = 0 # Large Physical Addresses Not supported in Mips32
+ TestCPUClass.CoreParams.CP0_Config3_VEIC = 0 # EIC Supported
+ TestCPUClass.CoreParams.CP0_Config3_VInt = 0 # Vectored Interrupts Implemented
+ TestCPUClass.CoreParams.CP0_Config3_SP = 0 # Small Pages Supported (PageGrain reg. exists)
+ TestCPUClass.CoreParams.CP0_Config3_MT = 0 # MT Not present
+ TestCPUClass.CoreParams.CP0_Config3_SM = 0 # SmartMIPS ASE Not implemented
+ TestCPUClass.CoreParams.CP0_Config3_TL = 0 # TraceLogic Not implemented
+
+ #SRS Ctl - HSS
+ TestCPUClass.CoreParams.CP0_SrsCtl_HSS = 3 # Four shadow register sets implemented
+
+
+ #TestCPUClass.CoreParams.tlb = TLB()
+ #TestCPUClass.CoreParams.UnifiedTLB = 1
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/FSConfig.py.orig
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/FSConfig.py.orig Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,469 @@
+# Copyright (c) 2006-2008 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.
+#
+# Authors: Kevin Lim
+
+from m5.objects import *
+from Benchmarks import *
+
+class CowIdeDisk(IdeDisk):
+ image = CowDiskImage(child=RawDiskImage(read_only=True),
+ read_only=False)
+
+ def childImage(self, ci):
+ self.image.child.image_file = ci
+
+class MemBus(Bus):
+ badaddr_responder = BadAddr()
+ default = Self.badaddr_responder.pio
+
+def makeDramSimLinuxAlphaSystem(mem_mode, mdesc=None, extraParameters="", settingsFilename="", benchmarkName=None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+ self = LinuxAlphaSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1, clock='4000MHz')
+ self.bridge = Bridge(delay='2ns', nack_delay='1ns')
+
+ if mdesc.scriptname != None:
+ outFile = mdesc.scriptname.split('.')[0]
+ elif benchmarkName != None:
+ outFile = benchmarkName
+ else:
+ outFile = ''
+
+ self.physmem = M5dramSystem(extraParameters=extraParameters,
+ settingsFile=settingsFilename,
+ outFilename=outFile,
+ commandLine=outFile,
+ range=AddrRange(mdesc.mem()))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.iobus)
+ self.tsunami.ide.pio = self.iobus.port
+ self.tsunami.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+
+def makeLinuxAlphaSystem(mem_mode, mdesc = None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+
+ self = LinuxAlphaSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.iobus)
+ self.tsunami.ide.pio = self.iobus.port
+ self.tsunami.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
+ read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+def makeLinuxAlphaRubySystem(mem_mode, mdesc = None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+
+ physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ self = LinuxAlphaSystem(physmem = physmem)
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+
+ # Create pio bus to connect all device pio ports to rubymem's pio port
+ self.piobus = Bus(bus_id=0)
+
+ #
+ # Pio functional accesses from devices need direct access to memory
+ # RubyPort currently does support functional accesses. Therefore provide
+ # the piobus a direct connection to physical memory
+ #
+ self.piobus.port = physmem.port
+
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.piobus)
+ self.tsunami.ide.pio = self.piobus.port
+ self.tsunami.ethernet.pio = self.piobus.port
+
+ #
+ # store the dma devices for later connection to dma ruby ports
+ #
+ self.dma_devices = [self.tsunami.ide, self.tsunami.ethernet]
+
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
+ read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+def makeSparcSystem(mem_mode, mdesc = None):
+ class CowMmDisk(MmDisk):
+ image = CowDiskImage(child=RawDiskImage(read_only=True),
+ read_only=False)
+
+ def childImage(self, ci):
+ self.image.child.image_file = ci
+
+ self = SparcSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.t1000 = T1000()
+ self.t1000.attachOnChipIO(self.membus)
+ self.t1000.attachIO(self.iobus)
+ self.physmem = PhysicalMemory(range = AddrRange(Addr('1MB'), size = '64MB'), zero = True)
+ self.physmem2 = PhysicalMemory(range = AddrRange(Addr('2GB'), size ='256MB'), zero = True)
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.physmem2.port = self.membus.port
+ self.rom.port = self.membus.port
+ self.nvram.port = self.membus.port
+ self.hypervisor_desc.port = self.membus.port
+ self.partition_desc.port = self.membus.port
+ self.intrctrl = IntrControl()
+ self.disk0 = CowMmDisk()
+ self.disk0.childImage(disk('disk.s10hw2'))
+ self.disk0.pio = self.iobus.port
+ self.reset_bin = binary('reset_new.bin')
+ self.hypervisor_bin = binary('q_new.bin')
+ self.openboot_bin = binary('openboot_new.bin')
+ self.nvram_bin = binary('nvram1')
+ self.hypervisor_desc_bin = binary('1up-hv.bin')
+ self.partition_desc_bin = binary('1up-md.bin')
+
+ return self
+
+def makeLinuxMipsSystem(mem_mode, mdesc = None):
+ class BaseMalta(Malta):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+
+ self = LinuxMipsSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.physmem = PhysicalMemory(range = AddrRange('1GB'))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.malta = BaseMalta()
+ self.malta.attachIO(self.iobus)
+ self.malta.ide.pio = self.iobus.port
+ self.malta.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
+ read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('mips/vmlinux')
+ self.console = binary('mips/console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+def x86IOAddress(port):
+ IO_address_space_base = 0x8000000000000000
+ return IO_address_space_base + port;
+
+def makeX86System(mem_mode, numCPUs = 1, mdesc = None, self = None):
+ if self == None:
+ self = X86System()
+
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ mdesc.diskname = 'x86root.img'
+ self.readfile = mdesc.script()
+
+ self.mem_mode = mem_mode
+
+ # Physical memory
+ self.membus = MemBus(bus_id=1)
+ self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ self.physmem.port = self.membus.port
+
+ # North Bridge
+ self.iobus = Bus(bus_id=0)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+
+ # Platform
+ self.pc = Pc()
+ self.pc.attachIO(self.iobus)
+
+ self.intrctrl = IntrControl()
+
+ # Disks
+ disk0 = CowIdeDisk(driveID='master')
+ disk2 = CowIdeDisk(driveID='master')
+ disk0.childImage(mdesc.disk())
+ disk2.childImage(disk('linux-bigswap2.img'))
+ self.pc.south_bridge.ide.disks = [disk0, disk2]
+
+ # Add in a Bios information structure.
+ structures = [X86SMBiosBiosInformation()]
+ self.smbios_table.structures = structures
+
+ # Set up the Intel MP table
+ for i in xrange(numCPUs):
+ bp = X86IntelMPProcessor(
+ local_apic_id = i,
+ local_apic_version = 0x14,
+ enable = True,
+ bootstrap = (i == 0))
+ self.intel_mp_table.add_entry(bp)
+ io_apic = X86IntelMPIOAPIC(
+ id = numCPUs,
+ version = 0x11,
+ enable = True,
+ address = 0xfec00000)
+ self.pc.south_bridge.io_apic.apic_id = io_apic.id
+ self.intel_mp_table.add_entry(io_apic)
+ isa_bus = X86IntelMPBus(bus_id = 0, bus_type='ISA')
+ self.intel_mp_table.add_entry(isa_bus)
+ pci_bus = X86IntelMPBus(bus_id = 1, bus_type='PCI')
+ self.intel_mp_table.add_entry(pci_bus)
+ connect_busses = X86IntelMPBusHierarchy(bus_id=0,
+ subtractive_decode=True, parent_bus=1)
+ self.intel_mp_table.add_entry(connect_busses)
+ pci_dev4_inta = X86IntelMPIOIntAssignment(
+ interrupt_type = 'INT',
+ polarity = 'ConformPolarity',
+ trigger = 'ConformTrigger',
+ source_bus_id = 1,
+ source_bus_irq = 0 + (4 << 2),
+ dest_io_apic_id = io_apic.id,
+ dest_io_apic_intin = 16)
+ self.intel_mp_table.add_entry(pci_dev4_inta);
+ def assignISAInt(irq, apicPin):
+ assign_8259_to_apic = X86IntelMPIOIntAssignment(
+ interrupt_type = 'ExtInt',
+ polarity = 'ConformPolarity',
+ trigger = 'ConformTrigger',
+ source_bus_id = 0,
+ source_bus_irq = irq,
+ dest_io_apic_id = io_apic.id,
+ dest_io_apic_intin = 0)
+ self.intel_mp_table.add_entry(assign_8259_to_apic)
+ assign_to_apic = X86IntelMPIOIntAssignment(
+ interrupt_type = 'INT',
+ polarity = 'ConformPolarity',
+ trigger = 'ConformTrigger',
+ source_bus_id = 0,
+ source_bus_irq = irq,
+ dest_io_apic_id = io_apic.id,
+ dest_io_apic_intin = apicPin)
+ self.intel_mp_table.add_entry(assign_to_apic)
+ assignISAInt(0, 2)
+ assignISAInt(1, 1)
+ for i in range(3, 15):
+ assignISAInt(i, i)
+
+
+def makeLinuxX86System(mem_mode, numCPUs = 1, mdesc = None):
+ self = LinuxX86System()
+
+ # Build up a generic x86 system and then specialize it for Linux
+ makeX86System(mem_mode, numCPUs, mdesc, self)
+
+ # We assume below that there's at least 1MB of memory. We'll require 2
+ # just to avoid corner cases.
+ assert(self.physmem.range.second.getValue() >= 0x200000)
+
+ # Mark the first megabyte of memory as reserved
+ self.e820_table.entries.append(X86E820Entry(
+ addr = 0,
+ size = '1MB',
+ range_type = 2))
+
+ # Mark the rest as available
+ self.e820_table.entries.append(X86E820Entry(
+ addr = 0x100000,
+ size = '%dB' % (self.physmem.range.second - 0x100000 + 1),
+ range_type = 1))
+
+ # Command line
+ self.boot_osflags = 'earlyprintk=ttyS0 console=ttyS0 lpj=7999923 ' + \
+ 'root=/dev/hda1'
+ return self
+
+
+def makeDualRoot(testSystem, driveSystem, dumpfile):
+ self = Root()
+ self.testsys = testSystem
+ self.drivesys = driveSystem
+ self.etherlink = EtherLink()
+ self.etherlink.int0 = Parent.testsys.tsunami.ethernet.interface
+ self.etherlink.int1 = Parent.drivesys.tsunami.ethernet.interface
+
+ if dumpfile:
+ self.etherdump = EtherDump(file=dumpfile)
+ self.etherlink.dump = Parent.etherdump
+
+ return self
+
+def setMipsOptions(TestCPUClass):
+ #CP0 Configuration
+ TestCPUClass.CoreParams.CP0_PRId_CompanyOptions = 0
+ TestCPUClass.CoreParams.CP0_PRId_CompanyID = 1
+ TestCPUClass.CoreParams.CP0_PRId_ProcessorID = 147
+ TestCPUClass.CoreParams.CP0_PRId_Revision = 0
+
+ #CP0 Interrupt Control
+ TestCPUClass.CoreParams.CP0_IntCtl_IPTI = 7
+ TestCPUClass.CoreParams.CP0_IntCtl_IPPCI = 7
+
+ # Config Register
+ #TestCPUClass.CoreParams.CP0_Config_K23 = 0 # Since TLB
+ #TestCPUClass.CoreParams.CP0_Config_KU = 0 # Since TLB
+ TestCPUClass.CoreParams.CP0_Config_BE = 0 # Little Endian
+ TestCPUClass.CoreParams.CP0_Config_AR = 1 # Architecture Revision 2
+ TestCPUClass.CoreParams.CP0_Config_AT = 0 # MIPS32
+ TestCPUClass.CoreParams.CP0_Config_MT = 1 # TLB MMU
+ #TestCPUClass.CoreParams.CP0_Config_K0 = 2 # Uncached
+
+ #Config 1 Register
+ TestCPUClass.CoreParams.CP0_Config1_M = 1 # Config2 Implemented
+ TestCPUClass.CoreParams.CP0_Config1_MMU = 63 # TLB Size
+ # ***VERY IMPORTANT***
+ # Remember to modify CP0_Config1 according to cache specs
+ # Examine file ../common/Cache.py
+ TestCPUClass.CoreParams.CP0_Config1_IS = 1 # I-Cache Sets Per Way, 16KB cache, i.e., 1 (128)
+ TestCPUClass.CoreParams.CP0_Config1_IL = 5 # I-Cache Line Size, default in Cache.py is 64, i.e 5
+ TestCPUClass.CoreParams.CP0_Config1_IA = 1 # I-Cache Associativity, default in Cache.py is 2, i.e, a value of 1
+ TestCPUClass.CoreParams.CP0_Config1_DS = 2 # D-Cache Sets Per Way (see below), 32KB cache, i.e., 2
+ TestCPUClass.CoreParams.CP0_Config1_DL = 5 # D-Cache Line Size, default is 64, i.e., 5
+ TestCPUClass.CoreParams.CP0_Config1_DA = 1 # D-Cache Associativity, default is 2, i.e. 1
+ TestCPUClass.CoreParams.CP0_Config1_C2 = 0 # Coprocessor 2 not implemented(?)
+ TestCPUClass.CoreParams.CP0_Config1_MD = 0 # MDMX ASE not implemented in Mips32
+ TestCPUClass.CoreParams.CP0_Config1_PC = 1 # Performance Counters Implemented
+ TestCPUClass.CoreParams.CP0_Config1_WR = 0 # Watch Registers Implemented
+ TestCPUClass.CoreParams.CP0_Config1_CA = 0 # Mips16e NOT implemented
+ TestCPUClass.CoreParams.CP0_Config1_EP = 0 # EJTag Not Implemented
+ TestCPUClass.CoreParams.CP0_Config1_FP = 0 # FPU Implemented
+
+ #Config 2 Register
+ TestCPUClass.CoreParams.CP0_Config2_M = 1 # Config3 Implemented
+ TestCPUClass.CoreParams.CP0_Config2_TU = 0 # Tertiary Cache Control
+ TestCPUClass.CoreParams.CP0_Config2_TS = 0 # Tertiary Cache Sets Per Way
+ TestCPUClass.CoreParams.CP0_Config2_TL = 0 # Tertiary Cache Line Size
+ TestCPUClass.CoreParams.CP0_Config2_TA = 0 # Tertiary Cache Associativity
+ TestCPUClass.CoreParams.CP0_Config2_SU = 0 # Secondary Cache Control
+ TestCPUClass.CoreParams.CP0_Config2_SS = 0 # Secondary Cache Sets Per Way
+ TestCPUClass.CoreParams.CP0_Config2_SL = 0 # Secondary Cache Line Size
+ TestCPUClass.CoreParams.CP0_Config2_SA = 0 # Secondary Cache Associativity
+
+
+ #Config 3 Register
+ TestCPUClass.CoreParams.CP0_Config3_M = 0 # Config4 Not Implemented
+ TestCPUClass.CoreParams.CP0_Config3_DSPP = 1 # DSP ASE Present
+ TestCPUClass.CoreParams.CP0_Config3_LPA = 0 # Large Physical Addresses Not supported in Mips32
+ TestCPUClass.CoreParams.CP0_Config3_VEIC = 0 # EIC Supported
+ TestCPUClass.CoreParams.CP0_Config3_VInt = 0 # Vectored Interrupts Implemented
+ TestCPUClass.CoreParams.CP0_Config3_SP = 0 # Small Pages Supported (PageGrain reg. exists)
+ TestCPUClass.CoreParams.CP0_Config3_MT = 0 # MT Not present
+ TestCPUClass.CoreParams.CP0_Config3_SM = 0 # SmartMIPS ASE Not implemented
+ TestCPUClass.CoreParams.CP0_Config3_TL = 0 # TraceLogic Not implemented
+
+ #SRS Ctl - HSS
+ TestCPUClass.CoreParams.CP0_SrsCtl_HSS = 3 # Four shadow register sets implemented
+
+
+ #TestCPUClass.CoreParams.tlb = TLB()
+ #TestCPUClass.CoreParams.UnifiedTLB = 1
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/Options.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/Options.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,105 @@
+# Copyright (c) 2006-2008 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.
+#
+# Authors: Lisa Hsu
+
+# system options
+parser.add_option("-d", "--detailed", action="store_true")
+parser.add_option("-t", "--timing", action="store_true")
+parser.add_option("--inorder", action="store_true")
+parser.add_option("-n", "--num-cpus", type="int", default=1)
+parser.add_option("--caches", action="store_true")
+parser.add_option("--l1cache", action="store_true")
+parser.add_option("--l2cache", action="store_true")
+parser.add_option("--l3cache", action="store_true")
+parser.add_option("--fastmem", action="store_true")
+parser.add_option("--clock", action="store", type="string", default='1GHz')
+parser.add_option("--num-dirs", type="int", default=1)
+parser.add_option("--num-l2caches", type="int", default=1)
+parser.add_option("--topology", type="string", default="Crossbar",
+ help="check src/mem/ruby/network/topologies for complete set")
+parser.add_option("--mesh-rows", type="int", default=1,
+ help="the number of rows in the mesh topology")
+parser.add_option("--garnet-network", type="string", default=None,
+ help="'fixed'|'flexible'")
+parser.add_option("--numa-high-bit", type="int", default=None,
+ help="high order address bit to use for numa mapping")
+
+# ruby sparse memory options
+parser.add_option("--use-map", action="store_true", default=False)
+parser.add_option("--map-levels", type="int", default=4)
+
+# Run duration options
+parser.add_option("-m", "--maxtick", type="int", default=m5.MaxTick,
+ metavar="T",
+ help="Stop after T ticks")
+parser.add_option("--maxtime", type="float")
+parser.add_option("--maxinsts", type="int")
+parser.add_option("--prog_intvl", type="int")
+
+
+# Checkpointing options
+###Note that performing checkpointing via python script files will override
+###checkpoint instructions built into binaries.
+parser.add_option("--take-checkpoints", action="store", type="string",
+ help=" will take checkpoint at cycle M and every N cycles thereafter")
+parser.add_option("--max-checkpoints", action="store", type="int",
+ help="the maximum number of checkpoints to drop", default=5)
+parser.add_option("--checkpoint-dir", action="store", type="string",
+ help="Place all checkpoints in this absolute directory")
+parser.add_option("-r", "--checkpoint-restore", action="store", type="int",
+ help="restore from checkpoint ")
+parser.add_option("--checkpoint-at-end", action="store_true",
+ help="take a checkpoint at end of run")
+
+
+# CPU Switching - default switch model goes from a checkpoint
+# to a timing simple CPU with caches to warm up, then to detailed CPU for
+# data measurement
+parser.add_option("-s", "--standard-switch", action="store_true",
+ help="switch from timing CPU to Detailed CPU")
+parser.add_option("-w", "--warmup", action="store", type="int",
+ help="if -s, then this is the warmup period. else, this is ignored",
+ default=5000000000)
+parser.add_option("--profile", help="CPU profile interval")
+
+# Fastforwarding and simpoint related materials
+parser.add_option("-W", "--warmup-insts", action="store", type="int",
+ default=None,
+ help="Warmup period in total instructions (requires --standard-switch)")
+parser.add_option("-I", "--max-inst", action="store", type="int", default=None,
+ help="Total number of instructions to simulate (default: run forever)")
+parser.add_option("--bench", action="store", type="string", default=None,
+ help="base names for --take-checkpoint and --checkpoint-restore")
+parser.add_option("-F", "--fast-forward", action="store", type="string",
+ default=None,
+ help="Number of instructions to fast forward before switching")
+parser.add_option("-S", "--simpoint", action="store_true", default=False,
+ help="""Use workload simpoints as an instruction offset for
+--checkpoint-restore or --take-checkpoint.""")
+parser.add_option("--at-instruction", action="store_true", default=False,
+ help="""Treate value of --checkpoint-restore or --take-checkpoint as a
+number of instructions.""")
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/Simulation.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/Simulation.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,374 @@
+# Copyright (c) 2006-2008 The Regents of The University of Michigan
+# Copyright (c) 2010 Advanced Micro Devices, Inc.
+# 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.
+#
+# Authors: Lisa Hsu
+
+from os import getcwd
+from os.path import join as joinpath
+
+import m5
+from m5.defines import buildEnv
+from m5.objects import *
+from m5.util import *
+
+addToPath('../common')
+
+def setCPUClass(options):
+
+ atomic = False
+ if options.timing:
+ class TmpClass(TimingSimpleCPU): pass
+ elif options.detailed:
+ if not options.caches:
+ print "O3 CPU must be used with caches"
+ sys.exit(1)
+ class TmpClass(DerivO3CPU): pass
+ elif options.inorder:
+ if not options.caches:
+ print "InOrder CPU must be used with caches"
+ sys.exit(1)
+ class TmpClass(InOrderCPU): pass
+ else:
+ class TmpClass(AtomicSimpleCPU): pass
+ atomic = True
+
+ CPUClass = None
+ test_mem_mode = 'atomic'
+
+ if not atomic:
+ if options.checkpoint_restore != None or options.fast_forward:
+ CPUClass = TmpClass
+ class TmpClass(AtomicSimpleCPU): pass
+ else:
+ test_mem_mode = 'timing'
+
+ return (TmpClass, test_mem_mode, CPUClass)
+
+
+def run(options, root, testsys, cpu_class):
+ if options.maxtick:
+ maxtick = options.maxtick
+ elif options.maxtime:
+ simtime = m5.ticks.seconds(simtime)
+ print "simulating for: ", simtime
+ maxtick = simtime
+ else:
+ maxtick = m5.MaxTick
+
+ if options.checkpoint_dir:
+ cptdir = options.checkpoint_dir
+ elif m5.options.outdir:
+ cptdir = m5.options.outdir
+ else:
+ cptdir = getcwd()
+
+ if options.fast_forward and options.checkpoint_restore != None:
+ fatal("Can't specify both --fast-forward and --checkpoint-restore")
+
+ if options.standard_switch and not options.caches:
+ fatal("Must specify --caches when using --standard-switch")
+
+ np = options.num_cpus
+ max_checkpoints = options.max_checkpoints
+ switch_cpus = None
+
+ if options.prog_intvl:
+ for i in xrange(np):
+ testsys.cpu[i].progress_interval = options.prog_intvl
+
+ if options.maxinsts:
+ for i in xrange(np):
+ testsys.cpu[i].max_insts_any_thread = options.maxinsts
+
+ if cpu_class:
+ switch_cpus = [cpu_class(defer_registration=True, cpu_id=(np+i))
+ for i in xrange(np)]
+
+ for i in xrange(np):
+ if options.fast_forward:
+ testsys.cpu[i].max_insts_any_thread = int(options.fast_forward)
+ switch_cpus[i].system = testsys
+ if not buildEnv['FULL_SYSTEM']:
+ switch_cpus[i].workload = testsys.cpu[i].workload
+ switch_cpus[i].clock = testsys.cpu[0].clock
+ # simulation period
+ if options.max_inst:
+ switch_cpus[i].max_insts_any_thread = options.max_inst
+
+ testsys.switch_cpus = switch_cpus
+ switch_cpu_list = [(testsys.cpu[i], switch_cpus[i]) for i in xrange(np)]
+
+ if options.standard_switch:
+ switch_cpus = [TimingSimpleCPU(defer_registration=True, cpu_id=(np+i))
+ for i in xrange(np)]
+ switch_cpus_1 = [DerivO3CPU(defer_registration=True, cpu_id=(2*np+i))
+ for i in xrange(np)]
+
+ for i in xrange(np):
+ switch_cpus[i].system = testsys
+ switch_cpus_1[i].system = testsys
+ if not buildEnv['FULL_SYSTEM']:
+ switch_cpus[i].workload = testsys.cpu[i].workload
+ switch_cpus_1[i].workload = testsys.cpu[i].workload
+ switch_cpus[i].clock = testsys.cpu[0].clock
+ switch_cpus_1[i].clock = testsys.cpu[0].clock
+
+ # if restoring, make atomic cpu simulate only a few instructions
+ if options.checkpoint_restore != None:
+ testsys.cpu[i].max_insts_any_thread = 1
+ # Fast forward to specified location if we are not restoring
+ elif options.fast_forward:
+ testsys.cpu[i].max_insts_any_thread = int(options.fast_forward)
+ # Fast forward to a simpoint (warning: time consuming)
+ elif options.simpoint:
+ if testsys.cpu[i].workload[0].simpoint == 0:
+ fatal('simpoint not found')
+ testsys.cpu[i].max_insts_any_thread = \
+ testsys.cpu[i].workload[0].simpoint
+ # No distance specified, just switch
+ else:
+ testsys.cpu[i].max_insts_any_thread = 1
+
+ # warmup period
+ if options.warmup_insts:
+ switch_cpus[i].max_insts_any_thread = options.warmup_insts
+
+ # simulation period
+ if options.max_inst:
+ switch_cpus_1[i].max_insts_any_thread = options.max_inst
+
+ if not options.caches:
+ # O3 CPU must have a cache to work.
+ print "O3 CPU must be used with caches"
+ sys.exit(1)
+
+ testsys.switch_cpus = switch_cpus
+ testsys.switch_cpus_1 = switch_cpus_1
+ switch_cpu_list = [(testsys.cpu[i], switch_cpus[i]) for i in xrange(np)]
+ switch_cpu_list1 = [(switch_cpus[i], switch_cpus_1[i]) for i in xrange(np)]
+
+ # set the checkpoint in the cpu before m5.instantiate is called
+ if options.take_checkpoints != None and \
+ (options.simpoint or options.at_instruction):
+ offset = int(options.take_checkpoints)
+ # Set an instruction break point
+ if options.simpoint:
+ for i in xrange(np):
+ if testsys.cpu[i].workload[0].simpoint == 0:
+ fatal('no simpoint for testsys.cpu[%d].workload[0]', i)
+ checkpoint_inst = int(testsys.cpu[i].workload[0].simpoint) + offset
+ testsys.cpu[i].max_insts_any_thread = checkpoint_inst
+ # used for output below
+ options.take_checkpoints = checkpoint_inst
+ else:
+ options.take_checkpoints = offset
+ # Set all test cpus with the right number of instructions
+ # for the upcoming simulation
+ for i in xrange(np):
+ testsys.cpu[i].max_insts_any_thread = offset
+
+ checkpoint_dir = None
+ if options.checkpoint_restore != None:
+ from os.path import isdir, exists
+ from os import listdir
+ import re
+
+ if not isdir(cptdir):
+ fatal("checkpoint dir %s does not exist!", cptdir)
+
+ if options.at_instruction or options.simpoint:
+ inst = options.checkpoint_restore
+ if options.simpoint:
+ # assume workload 0 has the simpoint
+ if testsys.cpu[0].workload[0].simpoint == 0:
+ fatal('Unable to find simpoint')
+ inst += int(testsys.cpu[0].workload[0].simpoint)
+
+ checkpoint_dir = joinpath(cptdir,
+ "cpt.%s.%s" % (options.bench, inst))
+ if not exists(checkpoint_dir):
+ fatal("Unable to find checkpoint directory %s", checkpoint_dir)
+ else:
+ dirs = listdir(cptdir)
+ expr = re.compile('cpt\.([0-9]*)')
+ cpts = []
+ for dir in dirs:
+ match = expr.match(dir)
+ if match:
+ cpts.append(match.group(1))
+
+ cpts.sort(lambda a,b: cmp(long(a), long(b)))
+
+ cpt_num = options.checkpoint_restore
+
+ if cpt_num > len(cpts):
+ fatal('Checkpoint %d not found', cpt_num)
+
+ ## Adjust max tick based on our starting tick
+ maxtick = maxtick - int(cpts[cpt_num - 1])
+ checkpoint_dir = joinpath(cptdir, "cpt.%s" % cpts[cpt_num - 1])
+
+ m5.instantiate(checkpoint_dir)
+
+ if options.standard_switch or cpu_class:
+ if options.standard_switch:
+ print "Switch at instruction count:%s" % \
+ str(testsys.cpu[0].max_insts_any_thread)
+ exit_event = m5.simulate()
+ elif cpu_class and options.fast_forward:
+ print "Switch at instruction count:%s" % \
+ str(testsys.cpu[0].max_insts_any_thread)
+ exit_event = m5.simulate()
+ else:
+ print "Switch at curTick count:%s" % str(10000)
+ exit_event = m5.simulate(10000)
+ print "Switched CPUS @ cycle = %s" % (m5.curTick())
+
+ # when you change to Timing (or Atomic), you halt the system
+ # given as argument. When you are finished with the system
+ # changes (including switchCpus), you must resume the system
+ # manually. You DON'T need to resume after just switching
+ # CPUs if you haven't changed anything on the system level.
+
+ m5.changeToTiming(testsys)
+ m5.switchCpus(switch_cpu_list)
+ m5.resume(testsys)
+
+ if options.standard_switch:
+ print "Switch at instruction count:%d" % \
+ (testsys.switch_cpus[0].max_insts_any_thread)
+
+ #warmup instruction count may have already been set
+ if options.warmup_insts:
+ exit_event = m5.simulate()
+ else:
+ exit_event = m5.simulate(options.warmup)
+ print "Switching CPUS @ cycle = %s" % (m5.curTick())
+ print "Simulation ends instruction count:%d" % \
+ (testsys.switch_cpus_1[0].max_insts_any_thread)
+ m5.drain(testsys)
+ m5.switchCpus(switch_cpu_list1)
+ m5.resume(testsys)
+
+ num_checkpoints = 0
+ exit_cause = ''
+
+ # If we're taking and restoring checkpoints, use checkpoint_dir
+ # option only for finding the checkpoints to restore from. This
+ # lets us test checkpointing by restoring from one set of
+ # checkpoints, generating a second set, and then comparing them.
+ if options.take_checkpoints and options.checkpoint_restore:
+ if m5.options.outdir:
+ cptdir = m5.options.outdir
+ else:
+ cptdir = getcwd()
+
+ # Checkpoints being taken via the command line at and at
+ # subsequent periods of . Checkpoint instructions
+ # received from the benchmark running are ignored and skipped in
+ # favor of command line checkpoint instructions.
+ if options.take_checkpoints != None :
+ if options.at_instruction or options.simpoint:
+ checkpoint_inst = int(options.take_checkpoints)
+
+ # maintain correct offset if we restored from some instruction
+ if options.checkpoint_restore != None:
+ checkpoint_inst += options.checkpoint_restore
+
+ print "Creating checkpoint at inst:%d" % (checkpoint_inst)
+ exit_event = m5.simulate()
+ print "exit cause = %s" % (exit_event.getCause())
+
+ # skip checkpoint instructions should they exist
+ while exit_event.getCause() == "checkpoint":
+ exit_event = m5.simulate()
+
+ if exit_event.getCause() == \
+ "a thread reached the max instruction count":
+ m5.checkpoint(joinpath(cptdir, "cpt.%s.%d" % \
+ (options.bench, checkpoint_inst)))
+ print "Checkpoint written."
+ num_checkpoints += 1
+
+ if exit_event.getCause() == "user interrupt received":
+ exit_cause = exit_event.getCause();
+ else:
+ when, period = options.take_checkpoints.split(",", 1)
+ when = int(when)
+ period = int(period)
+
+ exit_event = m5.simulate(when)
+ while exit_event.getCause() == "checkpoint":
+ exit_event = m5.simulate(when - m5.curTick())
+
+ if exit_event.getCause() == "simulate() limit reached":
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
+ num_checkpoints += 1
+
+ sim_ticks = when
+ exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
+ while num_checkpoints < max_checkpoints and \
+ exit_event.getCause() == "simulate() limit reached":
+ if (sim_ticks + period) > maxtick:
+ exit_event = m5.simulate(maxtick - sim_ticks)
+ exit_cause = exit_event.getCause()
+ break
+ else:
+ exit_event = m5.simulate(period)
+ sim_ticks += period
+ while exit_event.getCause() == "checkpoint":
+ exit_event = m5.simulate(sim_ticks - m5.curTick())
+ if exit_event.getCause() == "simulate() limit reached":
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
+ num_checkpoints += 1
+
+ if exit_event.getCause() != "simulate() limit reached":
+ exit_cause = exit_event.getCause();
+
+ else: # no checkpoints being taken via this script
+ if options.fast_forward:
+ m5.stats.reset()
+ print "**** REAL SIMULATION ****"
+ exit_event = m5.simulate(maxtick)
+
+ while exit_event.getCause() == "checkpoint":
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
+ num_checkpoints += 1
+ if num_checkpoints == max_checkpoints:
+ exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
+ break
+
+ exit_event = m5.simulate(maxtick - m5.curTick())
+ exit_cause = exit_event.getCause()
+
+ if exit_cause == '':
+ exit_cause = exit_event.getCause()
+ print 'Exiting @ cycle %i because %s' % (m5.curTick(), exit_cause)
+
+ if options.checkpoint_at_end:
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
+
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/common/SysPaths.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/common/SysPaths.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,71 @@
+# Copyright (c) 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.
+#
+# Authors: Ali Saidi
+
+import os, sys
+from os.path import isdir, join as joinpath
+from os import environ as env
+
+config_path = os.path.dirname(os.path.abspath(__file__))
+config_root = os.path.dirname(config_path)
+
+def disk(file):
+ system()
+ return joinpath(disk.dir, file)
+
+def binary(file):
+ system()
+ return joinpath(binary.dir, file)
+
+def script(file):
+ system()
+ return joinpath(script.dir, file)
+
+def system():
+ if not system.dir:
+ try:
+ path = env['M5_PATH'].split(':')
+ except KeyError:
+ path = [ '/dist/m5/system', '/n/poolfs/z/dist/m5/system' ]
+
+ for system.dir in path:
+ if os.path.isdir(system.dir):
+ break
+ else:
+ raise ImportError, "Can't find a path to system files."
+
+ if not binary.dir:
+ binary.dir = joinpath(system.dir, 'binaries')
+ if not disk.dir:
+ disk.dir = joinpath(system.dir, 'disks')
+ if not script.dir:
+ script.dir = joinpath(config_root, 'boot')
+
+system.dir = None
+binary.dir = None
+disk.dir = None
+script.dir = None
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/example/dramsim.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/example/dramsim.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,151 @@
+# Simple test script
+#
+# "m5 test.py"
+
+import m5
+from m5.objects import *
+import os, optparse, sys
+m5.AddToPath('../common')
+import Simulation
+from Caches import *
+from specbench import *
+import string
+
+# 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)
+
+parser = optparse.OptionParser()
+
+# Benchmark options
+parser.add_option("-c", "--cmd",
+ default=os.path.join(m5_root, "tests/test-progs/hello/bin/alpha/linux/hello"),
+ help="The binary to run in syscall emulation mode.")
+parser.add_option("-o", "--options", default="",
+ help="The options to pass to the binary, use \" \" around the entire\
+ string.")
+
+parser.add_option("-i", "--input", default="",
+ help="A file of input to give to the binary.")
+
+parser.add_option("-f", "--DRAMsimConfig",
+ default=os.path.join(m5_root, "/home/crius/m5/src/mem/DRAMsimII/memoryDefinitions/DDR2-800-4-4-4-25E.xml"),
+ help="The DRAMsimII config file.")
+
+parser.add_option("-b", "--benchmark",
+ default=None, help="Choose the number from the following:\nperlbench\nbzip2\ngcc\nbwaves\ngamess\nmcf\nmilc\nzeusmp\ngromacs\ncactusADM\nleslie3d\nnamd\ngobmk\ndealII\nsoplex\npovray\ncalculix\nhmmer\nsjeng\nGemsFDTD\nlibquantum\nh264ref\ntonto\nlbm\nomnetpp\nastar\nwrf\nsphinx3\nxalancbmk\n998.specrand_i\n999.specrand_f")
+
+parser.add_option("--simple", action="store_true")
+
+parser.add_option("--mp",
+ default="", help="Override default memory parameters with this switch")
+parser.add_option("--revert", default=None)
+
+
+execfile(os.path.join(config_root, "common", "Options.py"))
+
+(options, args) = parser.parse_args()
+
+if options.simple == True:
+ options.detailed = False
+ options.l2cache = False
+ options.caches = False
+else:
+ options.detailed = True
+ options.l2cache = True
+ options.caches = True
+
+if args:
+ print "Error: script doesn't take any positional arguments"
+ sys.exit(1)
+
+memorySize = '512MB'
+
+if options.benchmark is not None:
+ try:
+ cmdLine = cmdLineDict[options.benchmark]
+ process = liveProcessDict[options.benchmark]
+ executable = [cmdLineDict[options.benchmark]]
+ if options.benchmark in alternateMemorySize:
+ memorySize = alternateMemorySize[options.benchmark]
+
+ except KeyError:
+ print "Unknown benchmark.\n"
+ sys.exit()
+else:
+ process = LiveProcess()
+ process.executable = options.cmd
+ process.cmd = [options.cmd] + options.options.split()
+ if options.input != "":
+ process.input = options.input
+
+ executable = options.cmd.split("/")
+
+ if options.input != "":
+ cmdInput = " <%s" % options.input
+ else:
+ cmdInput = ""
+ cmdLine = executable[len(executable) - 1] + " " + options.options + cmdInput
+
+
+if options.detailed:
+ #check for SMT workload
+ workloads = options.cmd.split(';')
+ if len(workloads) > 1:
+ process = []
+ smt_idx = 0
+ inputs = []
+
+ if options.input != "":
+ inputs = options.input.split(';')
+
+ for wrkld in workloads:
+ smt_process = LiveProcess()
+ smt_process.executable = wrkld
+ smt_process.cmd = wrkld + " " + options.options
+ if inputs and inputs[smt_idx]:
+ smt_process.input = inputs[smt_idx]
+ process += [smt_process, ]
+ smt_idx += 1
+
+(CPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
+
+CPUClass.clock = '3GHz'
+
+np = options.num_cpus
+
+if options.revert:
+ print 'not using ds2'
+ system = System(cpu=[CPUClass(cpu_id=i) for i in xrange(np)],
+ physmem= PhysicalMemory(range=AddrRange(memorySize)),
+ membus=Bus(), mem_mode=test_mem_mode)
+else:
+ system = System(cpu=[CPUClass(cpu_id=i) for i in xrange(np)],
+ physmem=M5dramSystem(extraParameters=options.mp,
+ settingsFile=options.DRAMsimConfig,
+ outFilename=executable.pop(),
+ commandLine=cmdLine,
+ range=AddrRange(memorySize)),
+ membus=Bus(), mem_mode=test_mem_mode)
+
+system.physmem.port = system.membus.port
+
+for i in xrange(np):
+ if options.caches:
+ system.cpu[i].addPrivateSplitL1Caches(L1Cache(size='64kB', assoc=2),
+ L1Cache(size='64kB', assoc=2))
+ if options.l2cache:
+ system.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs=32, prefetch_policy='ghb', prefetch_degree=3, prefetcher_size=256, tgts_per_mshr=24, prefetch_cache_check_push=False)
+ #system.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs = 32, prefetch_policy = 'none', prefetch_degree = 3, prefetcher_size = 256, tgts_per_mshr=24, prefetch_cache_check_push=False)
+ system.tol2bus = Bus()
+ system.l2.cpu_side = system.tol2bus.port
+ system.l2.mem_side = system.membus.port
+ system.cpu[i].connectMemPorts(system.tol2bus)
+ else:
+ system.cpu[i].connectMemPorts(system.membus)
+ system.cpu[i].workload = process
+
+root = Root(system=system)
+
+Simulation.run(options, root, system, FutureClass)
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/example/dramsimfs16-16.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/example/dramsimfs16-16.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,287 @@
+# Copyright (c) 2006-2007 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.
+#
+# Authors: Ali Saidi
+
+import optparse
+import os
+import sys
+
+import m5
+from m5.defines import buildEnv
+from m5.objects import *
+from m5.util import addToPath, fatal
+
+if not buildEnv['FULL_SYSTEM']:
+ m5.panic("This script requires full-system mode (*_FS).")
+
+m5.util.addToPath('../common')
+
+from FSConfig import *
+from SysPaths import *
+from Benchmarks import *
+import Simulation
+from Caches import *
+
+#update Benchmarks to support our benchmarks
+Benchmarks['shutdown'] = [SysConfig('shutdown.rcS', '256MB')]
+Benchmarks['lbm'] = [SysConfig('lbm.rcS', '1024MB')]
+Benchmarks['lbmLong'] = [SysConfig('lbmLong.rcS', '1024MB')]
+Benchmarks['stream'] = [SysConfig('stream.rcS', '512MB')]
+Benchmarks['streamLong'] = [SysConfig('streamLong.rcS', '768MB')]
+Benchmarks['mcf'] = [SysConfig('mcf.rcS', '1500MB')]
+Benchmarks['mcfLong'] = [SysConfig('mcfLong.rcS', '1500MB')]
+Benchmarks['soplex'] = [SysConfig('soplex.rcS', '768MB')]
+Benchmarks['bzip2'] = [SysConfig('bzip2.rcS', '512MB')]
+Benchmarks['milc'] = [SysConfig('milc.rcS', '512MB')]
+Benchmarks['milcLong'] = [SysConfig('milcLong.rcS', '512MB')]
+Benchmarks['cactusADM'] = [SysConfig('cactusADM.rcS', '512MB')]
+Benchmarks['namd'] = [SysConfig('namd.rcS', '512MB')]
+Benchmarks['gobmk'] = [SysConfig('gobmk.rcS', '512MB')]
+Benchmarks['dealII'] = [SysConfig('dealII.rcS', '512MB')]
+Benchmarks['povray'] = [SysConfig('povray.rcS', '512MB')]
+Benchmarks['calculix'] = [SysConfig('calculix.rcS', '512MB')]
+Benchmarks['hmmer'] = [SysConfig('hmmer.rcS', '512MB')]
+Benchmarks['sjeng'] = [SysConfig('sjeng.rcS', '512MB')]
+Benchmarks['GemsFDTD'] = [SysConfig('GemsFDTD.rcS', '512MB')]
+Benchmarks['libquantum'] = [SysConfig('libquantum.rcS', '512MB')]
+Benchmarks['omnetpp'] = [SysConfig('omnetpp.rcS', '512MB')]
+Benchmarks['xalancbmk'] = [SysConfig('xalancbmk.rcS', '512MB')]
+Benchmarks['xalancbmkLong'] = [SysConfig('xalancbmkLong.rcS', '512MB')]
+
+benchs = Benchmarks.keys()
+benchs.sort()
+DefinedBenchmarks = ", ".join(benchs)
+
+
+def makeDramSimLinuxAlphaSystem(mem_mode, mdesc=None, extraParameters="", settingsFilename="", revert=None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+ self = LinuxAlphaSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1, clock='2600MHz')
+ self.bridge = Bridge(delay='5ns', nack_delay='1ns')
+ # use the memory size established by the benchmark definition in Benchmarks.py
+ jobnumber = ''
+ if 'PBS_JOBID' in os.environ:
+ jobnumber = os.environ['PBS_JOBID'].split('.')[0]
+
+ outFile = '' if mdesc.scriptname == None else mdesc.scriptname.split('.')[0] + jobnumber
+
+ if revert is not None:
+ print "reverting to use PhysicalMemory"
+ self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ else:
+ print "using DRAMsimII"
+ self.physmem = M5dramSystem(extraParameters=extraParameters,
+ settingsFile=settingsFilename,
+ outFilename=outFile,
+ commandLine=outFile,
+ range=AddrRange(mdesc.mem()))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.iobus)
+ self.tsunami.ide.pio = self.iobus.port
+ self.tsunami.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
+ read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+# 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)
+
+parser = optparse.OptionParser()
+
+# System options
+parser.add_option("--kernel", action="store", type="string")
+parser.add_option("--script", action="store", type="string")
+
+# Benchmark options
+parser.add_option("--dual", action="store_true",
+ help="Simulate two systems attached with an ethernet link")
+parser.add_option("-b", "--benchmark", action="store", type="string",
+ dest="benchmark",
+ help="Specify the benchmark to run. Available benchmarks: %s"\
+ % DefinedBenchmarks)
+
+# DRAMsimII specific options
+parser.add_option("-f", "--DRAMsimConfig",
+ default="",
+ help="The DRAMsimII config file.")
+
+parser.add_option("--mp",
+ default="", help="Override default memory parameters with this switch")
+
+parser.add_option("--revert", action="store_true")
+
+parser.add_option("--nopre", action="store_true")
+
+# Metafile options
+parser.add_option("--etherdump", action="store", type="string", dest="etherdump",
+ help="Specify the filename to dump a pcap capture of the" \
+ "ethernet traffic")
+
+
+execfile(os.path.join(config_root, "common", "Options.py"))
+
+(options, args) = parser.parse_args()
+
+options.l2cache = True
+options.caches = True
+options.detailed = True
+
+if args:
+ print "Error: script doesn't take any positional arguments"
+ sys.exit(1)
+
+# driver system CPU is always simple... note this is an assignment of
+# a class, not an instance.
+DriveCPUClass = AtomicSimpleCPU
+drive_mem_mode = 'atomic'
+
+# system under test can be any CPU
+(TestCPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
+
+TestCPUClass.clock = '6GHz'
+DriveCPUClass.clock = '6GHz'
+
+if options.benchmark:
+ try:
+ bm = Benchmarks[options.benchmark]
+ except KeyError:
+ print "Error benchmark %s has not been defined." % options.benchmark
+ print "Valid benchmarks are: %s" % DefinedBenchmarks
+ sys.exit(1)
+else:
+ if options.dual:
+ bm = [SysConfig(), SysConfig()]
+ else:
+ bm = [SysConfig()]
+
+np = options.num_cpus
+
+if buildEnv['TARGET_ISA'] == "alpha":
+ test_sys = makeDramSimLinuxAlphaSystem(test_mem_mode, bm[0], options.mp, options.DRAMsimConfig, options.revert)
+elif buildEnv['TARGET_ISA'] == "mips":
+ test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "sparc":
+ test_sys = makeSparcSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "x86":
+ test_sys = makeLinuxX86System(test_mem_mode, bm[0])
+else:
+ m5.panic("incapable of building non-alpha or non-sparc full system!")
+
+if options.kernel is not None:
+ test_sys.kernel = binary(options.kernel)
+
+if options.script is not None:
+ test_sys.readfile = options.script
+
+if options.l2cache:
+ if options.nopre is True:
+ print "no prefetcher"
+ test_sys.l2 = L2Cache(size='6MB', assoc=24, latency="4ns", mshrs = 32)
+ else:
+ #test_sys.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs=32, prefetch_policy='ghb', prefetch_degree=3, prefetcher_size=256, tgts_per_mshr=24, prefetch_cache_check_push=False)
+ #test_sys.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs=32, prefetch_policy='stride', prefetch_degree=2, prefetcher_size=64, prefetch_cache_check_push=True)
+ #test_sys.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs=32, prefetch_policy='ghb', prefetch_degree=2, prefetcher_size=16)
+ test_sys.l2 = L2Cache(size = '6MB', assoc=24, latency="6ns", mshrs = 22, tgts_per_mshr = 12)
+
+ test_sys.tol2bus = Bus()
+ test_sys.l2.cpu_side = test_sys.tol2bus.port
+ test_sys.l2.mem_side = test_sys.membus.port
+
+test_sys.cpu = [TestCPUClass(cpu_id=i) for i in xrange(np)]
+
+if options.caches or options.l2cache:
+ test_sys.bridge.filter_ranges_a=[AddrRange(0, Addr.max)]
+ test_sys.bridge.filter_ranges_b=[AddrRange(0, size='8GB')]
+ test_sys.iocache = IOCache(addr_range=AddrRange(0, size='8GB'))
+ test_sys.iocache.cpu_side = test_sys.iobus.port
+ test_sys.iocache.mem_side = test_sys.membus.port
+
+for i in xrange(np):
+ if options.caches:
+ test_sys.cpu[i].addPrivateSplitL1Caches(L1Cache(size = '64kB', latency="500ps", mshrs = 12, tgts_per_mshr = 6),
+ L1Cache(size = '64kB', latency="500ps", prefetch_policy='ghb', prefetch_degree=2, prefetcher_size=16))
+ #test_sys.cpu[i].addPrivateSplitL1Caches(L1Cache(size = '64kB', latency="500ps"),
+ # L1Cache(size = '64kB', latency="500ps"))
+ if options.l2cache:
+ test_sys.cpu[i].connectMemPorts(test_sys.tol2bus)
+ else:
+ test_sys.cpu[i].connectMemPorts(test_sys.membus)
+
+ if options.fastmem:
+ test_sys.cpu[i].physmem_port = test_sys.physmem.port
+
+if buildEnv['TARGET_ISA'] == 'mips':
+ setMipsOptions(TestCPUClass)
+
+if len(bm) == 2:
+ if m5.build_env['TARGET_ISA'] == 'alpha':
+ drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1])
+ elif m5.build_env['TARGET_ISA'] == 'mips':
+ drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1])
+ elif m5.build_env['TARGET_ISA'] == 'sparc':
+ drive_sys = makeSparcSystem(drive_mem_mode, bm[1])
+ elif m5.build.env['TARGET_ISA'] == 'x86':
+ drive_sys = makeX86System(drive_mem_mode, bm[1])
+ drive_sys.cpu = DriveCPUClass(cpu_id=0)
+ drive_sys.cpu.connectMemPorts(drive_sys.membus)
+ if options.fastmem:
+ drive_sys.cpu.physmem_port = drive_sys.physmem.port
+ if options.kernel is not None:
+ drive_sys.kernel = binary(options.kernel)
+
+ root = makeDualRoot(test_sys, drive_sys, options.etherdump)
+elif len(bm) == 1:
+ root = Root(system=test_sys)
+else:
+ print "Error I don't know how to create more than 2 systems."
+ sys.exit(1)
+
+Simulation.run(options, root, test_sys, FutureClass)
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/example/fs.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/example/fs.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,192 @@
+# Copyright (c) 2006-2007 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.
+#
+# Authors: Ali Saidi
+
+import optparse
+import os
+import sys
+
+import m5
+from m5.defines import buildEnv
+from m5.objects import *
+from m5.util import addToPath, fatal
+
+if not buildEnv['FULL_SYSTEM']:
+ fatal("This script requires full-system mode (*_FS).")
+
+addToPath('../common')
+
+from FSConfig import *
+from SysPaths import *
+from Benchmarks import *
+import Simulation
+import CacheConfig
+from Caches import *
+
+# 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)
+
+parser = optparse.OptionParser()
+
+# System options
+parser.add_option("--kernel", action="store", type="string")
+parser.add_option("--script", action="store", type="string")
+
+# Benchmark options
+parser.add_option("--dual", action="store_true",
+ help="Simulate two systems attached with an ethernet link")
+parser.add_option("-b", "--benchmark", action="store", type="string",
+ dest="benchmark",
+ help="Specify the benchmark to run. Available benchmarks: %s"\
+ % DefinedBenchmarks)
+
+# Metafile options
+parser.add_option("--etherdump", action="store", type="string", dest="etherdump",
+ help="Specify the filename to dump a pcap capture of the" \
+ "ethernet traffic")
+
+# DRAMsimII specific options
+parser.add_option("-f", "--DRAMsimConfig",
+ default="",
+ help="The DRAMsimII config file.")
+
+parser.add_option("--mp",
+ default="", help="Override default memory parameters with this switch")
+
+parser.add_option("--revert", action="store_true")
+
+parser.add_option("--nopre", action="store_true")
+
+parser.add_option("--benchmarkName", default="")
+
+parser.add_option("--memsize", default=None)
+
+# more options
+execfile(os.path.join(config_root, "common", "Options.py"))
+
+(options, args) = parser.parse_args()
+
+if args:
+ print "Error: script doesn't take any positional arguments"
+ sys.exit(1)
+
+# driver system CPU is always simple... note this is an assignment of
+# a class, not an instance.
+DriveCPUClass = AtomicSimpleCPU
+drive_mem_mode = 'atomic'
+
+# system under test can be any CPU
+(TestCPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
+
+TestCPUClass.clock = '4GHz'
+DriveCPUClass.clock = '4GHz'
+
+if options.benchmark:
+ try:
+ bm = Benchmarks[options.benchmark]
+ except KeyError:
+ print "Error benchmark %s has not been defined." % options.benchmark
+ print "Valid benchmarks are: %s" % DefinedBenchmarks
+ sys.exit(1)
+else:
+ if options.dual:
+ bm = [SysConfig(), SysConfig()]
+ else:
+ bm = [SysConfig()]
+
+np = options.num_cpus
+
+if buildEnv['TARGET_ISA'] == "alpha":
+ if options.revert:
+ print "info: using PhysicalMemory"
+ test_sys = makeLinuxAlphaSystem(test_mem_mode, bm[0])
+ else:
+ print "info: using DRAMsimII"
+ if options.memsize is not None:
+ sc = SysConfig(mem=options.memsize)
+ else:
+ sc = SysConfig(mem="512MB")
+ test_sys = makeDramSimLinuxAlphaSystem(test_mem_mode, sc, options.mp, options.DRAMsimConfig, options.benchmarkName)
+
+elif buildEnv['TARGET_ISA'] == "mips":
+ test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "sparc":
+ test_sys = makeSparcSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "x86":
+ test_sys = makeLinuxX86System(test_mem_mode, np, bm[0])
+else:
+ fatal("incapable of building non-alpha or non-sparc full system!")
+
+if options.kernel is not None:
+ test_sys.kernel = binary(options.kernel)
+
+if options.script is not None:
+ test_sys.readfile = options.script
+
+test_sys.cpu = [TestCPUClass(cpu_id=i) for i in xrange(np)]
+
+CacheConfig.config_cache(options, test_sys)
+
+if options.caches or options.l1cache or options.l2cache or options.l3cache:
+ test_sys.bridge.filter_ranges_a=[AddrRange(0, Addr.max)]
+ test_sys.bridge.filter_ranges_b=[AddrRange(0, size='8GB')]
+ test_sys.iocache = IOCache(addr_range=AddrRange(0, size='8GB'))
+ test_sys.iocache.cpu_side = test_sys.iobus.port
+ test_sys.iocache.mem_side = test_sys.membus.port
+
+for i in xrange(np):
+ if options.fastmem:
+ test_sys.cpu[i].physmem_port = test_sys.physmem.port
+
+if buildEnv['TARGET_ISA'] == 'mips':
+ setMipsOptions(TestCPUClass)
+
+if len(bm) == 2:
+ if buildEnv['TARGET_ISA'] == 'alpha':
+ drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1])
+ elif buildEnv['TARGET_ISA'] == 'mips':
+ drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1])
+ elif buildEnv['TARGET_ISA'] == 'sparc':
+ drive_sys = makeSparcSystem(drive_mem_mode, bm[1])
+ elif buildEnv['TARGET_ISA'] == 'x86':
+ drive_sys = makeX86System(drive_mem_mode, np, bm[1])
+ drive_sys.cpu = DriveCPUClass(cpu_id=0)
+ drive_sys.cpu.connectMemPorts(drive_sys.membus)
+ if options.fastmem:
+ drive_sys.cpu.physmem_port = drive_sys.physmem.port
+ if options.kernel is not None:
+ drive_sys.kernel = binary(options.kernel)
+
+ root = makeDualRoot(test_sys, drive_sys, options.etherdump)
+elif len(bm) == 1:
+ root = Root(system=test_sys)
+else:
+ print "Error I don't know how to create more than 2 systems."
+ sys.exit(1)
+
+Simulation.run(options, root, test_sys, FutureClass)
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/example/fsM5.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/example/fsM5.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,190 @@
+# Copyright (c) 2010 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.
+#
+# Copyright (c) 2006-2007 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.
+#
+# Authors: Ali Saidi
+
+import optparse
+import os
+import sys
+
+import m5
+from m5.defines import buildEnv
+from m5.objects import *
+from m5.util import addToPath, fatal
+
+if not buildEnv['FULL_SYSTEM']:
+ fatal("This script requires full-system mode (*_FS).")
+
+addToPath('../common')
+
+from FSConfig import *
+from SysPaths import *
+from Benchmarks import *
+import Simulation
+import CacheConfig
+from Caches import *
+
+# 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)
+
+parser = optparse.OptionParser()
+
+# System options
+parser.add_option("--kernel", action = "store", type = "string")
+parser.add_option("--script", action = "store", type = "string")
+if buildEnv['TARGET_ISA'] == "arm":
+ parser.add_option("--bare-metal", action = "store_true",
+ help = "Provide the raw system without the linux specific bits")
+ parser.add_option("--machine-type", action = "store", type = "choice",
+ choices = ArmMachineType.map.keys(), default = "RealView_PBX")
+# Benchmark options
+parser.add_option("--dual", action = "store_true",
+ help = "Simulate two systems attached with an ethernet link")
+parser.add_option("-b", "--benchmark", action = "store", type = "string",
+ dest = "benchmark",
+ help = "Specify the benchmark to run. Available benchmarks: %s"\
+ % DefinedBenchmarks)
+
+# Metafile options
+parser.add_option("--etherdump", action = "store", type = "string", dest = "etherdump",
+ help = "Specify the filename to dump a pcap capture of the" \
+ "ethernet traffic")
+
+execfile(os.path.join(config_root, "common", "Options.py"))
+
+(options, args) = parser.parse_args()
+
+if args:
+ print "Error: script doesn't take any positional arguments"
+ sys.exit(1)
+
+# driver system CPU is always simple... note this is an assignment of
+# a class, not an instance.
+DriveCPUClass = AtomicSimpleCPU
+drive_mem_mode = 'atomic'
+
+# system under test can be any CPU
+(TestCPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
+
+TestCPUClass.clock = '5GHz'
+DriveCPUClass.clock = '5GHz'
+
+if options.benchmark:
+ try:
+ bm = Benchmarks[options.benchmark]
+ except KeyError:
+ print "Error benchmark %s has not been defined." % options.benchmark
+ print "Valid benchmarks are: %s" % DefinedBenchmarks
+ sys.exit(1)
+else:
+ if options.dual:
+ bm = [SysConfig(), SysConfig()]
+ else:
+ bm = [SysConfig()]
+
+np = options.num_cpus
+
+if buildEnv['TARGET_ISA'] == "alpha":
+ test_sys = makeLinuxAlphaSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "mips":
+ test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "sparc":
+ test_sys = makeSparcSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "x86":
+ test_sys = makeLinuxX86System(test_mem_mode, np, bm[0])
+elif buildEnv['TARGET_ISA'] == "arm":
+ test_sys = makeLinuxArmSystem(test_mem_mode, bm[0],
+ bare_metal = options.bare_metal, machine_type = options.machine_type)
+else:
+ fatal("incapable of building non-alpha or non-sparc full system!")
+
+if options.kernel is not None:
+ test_sys.kernel = binary(options.kernel)
+
+if options.script is not None:
+ test_sys.readfile = options.script
+
+test_sys.cpu = [TestCPUClass(cpu_id = i) for i in xrange(np)]
+
+CacheConfig.config_cache(options, test_sys)
+
+if options.caches or options.l2cache:
+ if bm[0]:
+ mem_size = bm[0].mem()
+ else:
+ mem_size = SysConfig().mem()
+ test_sys.bridge.filter_ranges_a = [AddrRange(0, Addr.max)]
+ test_sys.bridge.filter_ranges_b = [AddrRange(mem_size)]
+ test_sys.iocache = IOCache(addr_range = mem_size)
+ test_sys.iocache.cpu_side = test_sys.iobus.port
+ test_sys.iocache.mem_side = test_sys.membus.port
+
+for i in xrange(np):
+ if options.fastmem:
+ test_sys.cpu[i].physmem_port = test_sys.physmem.port
+
+if buildEnv['TARGET_ISA'] == 'mips':
+ setMipsOptions(TestCPUClass)
+
+if len(bm) == 2:
+ if buildEnv['TARGET_ISA'] == 'alpha':
+ drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1])
+ elif buildEnv['TARGET_ISA'] == 'mips':
+ drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1])
+ elif buildEnv['TARGET_ISA'] == 'sparc':
+ drive_sys = makeSparcSystem(drive_mem_mode, bm[1])
+ elif buildEnv['TARGET_ISA'] == 'x86':
+ drive_sys = makeX86System(drive_mem_mode, np, bm[1])
+ elif buildEnv['TARGET_ISA'] == 'arm':
+ drive_sys = makeLinuxArmSystem(drive_mem_mode, bm[1])
+ drive_sys.cpu = DriveCPUClass(cpu_id = 0)
+ drive_sys.cpu.connectMemPorts(drive_sys.membus)
+ if options.fastmem:
+ drive_sys.cpu.physmem_port = drive_sys.physmem.port
+ if options.kernel is not None:
+ drive_sys.kernel = binary(options.kernel)
+
+ root = makeDualRoot(test_sys, drive_sys, options.etherdump)
+elif len(bm) == 1:
+ root = Root(system = test_sys)
+else:
+ print "Error I don't know how to create more than 2 systems."
+ sys.exit(1)
+
+Simulation.run(options, root, test_sys, FutureClass)
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/example/fsNehalem.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/example/fsNehalem.py Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,287 @@
+# Copyright (c) 2006-2007 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.
+#
+# Authors: Ali Saidi
+
+import optparse
+import os
+import sys
+
+import m5
+from m5.defines import buildEnv
+from m5.objects import *
+from m5.util import addToPath, fatal
+
+if not buildEnv['FULL_SYSTEM']:
+ m5.panic("This script requires full-system mode (*_FS).")
+
+m5.util.addToPath('../common')
+
+from FSConfig import *
+from SysPaths import *
+from Benchmarks import *
+import Simulation
+from Caches import *
+
+#update Benchmarks to support our benchmarks
+Benchmarks['shutdown'] = [SysConfig('shutdown.rcS', '256MB')]
+Benchmarks['lbm'] = [SysConfig('lbm.rcS', '1024MB')]
+Benchmarks['stream'] = [SysConfig('stream.rcS', '512MB')]
+Benchmarks['streamLong'] = [SysConfig('streamLong.rcS', '768MB')]
+Benchmarks['mcf'] = [SysConfig('mcf.rcS', '1500MB')]
+Benchmarks['soplex'] = [SysConfig('soplex.rcS', '768MB')]
+Benchmarks['bzip2'] = [SysConfig('bzip2.rcS', '512MB')]
+Benchmarks['milc'] = [SysConfig('milc.rcS', '512MB')]
+Benchmarks['milcLong'] = [SysConfig('milcLong.rcS', '512MB')]
+Benchmarks['mcfLong'] = [SysConfig('mcfLong.rcS', '2GB')]
+Benchmarks['cactusADM'] = [SysConfig('cactusADM.rcS', '512MB')]
+Benchmarks['namd'] = [SysConfig('namd.rcS', '512MB')]
+Benchmarks['gobmk'] = [SysConfig('gobmk.rcS', '512MB')]
+Benchmarks['dealII'] = [SysConfig('dealII.rcS', '512MB')]
+Benchmarks['povray'] = [SysConfig('povray.rcS', '512MB')]
+Benchmarks['calculix'] = [SysConfig('calculix.rcS', '512MB')]
+Benchmarks['hmmer'] = [SysConfig('hmmer.rcS', '512MB')]
+Benchmarks['sjeng'] = [SysConfig('sjeng.rcS', '512MB')]
+Benchmarks['GemsFDTD'] = [SysConfig('GemsFDTD.rcS', '512MB')]
+Benchmarks['libquantum'] = [SysConfig('libquantum.rcS', '512MB')]
+Benchmarks['omnetpp'] = [SysConfig('omnetpp.rcS', '512MB')]
+Benchmarks['xalancbmk'] = [SysConfig('xalancbmk.rcS', '512MB')]
+
+benchs = Benchmarks.keys()
+benchs.sort()
+DefinedBenchmarks = ", ".join(benchs)
+
+
+def makeDramSimLinuxAlphaSystem(mem_mode, mdesc=None, extraParameters="", settingsFilename="", revert=None):
+ class BaseTsunami(Tsunami):
+ ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
+ ide = IdeController(disks=[Parent.disk0, Parent.disk2],
+ pci_func=0, pci_dev=0, pci_bus=0)
+ self = LinuxAlphaSystem()
+ if not mdesc:
+ # generic system
+ mdesc = SysConfig()
+ self.readfile = mdesc.script()
+ self.iobus = Bus(bus_id=0)
+ self.membus = MemBus(bus_id=1, clock='2600MHz')
+ self.bridge = Bridge(delay='5ns', nack_delay='1ns')
+ # use the memory size established by the benchmark definition in Benchmarks.py
+ #if 'PBS_JOBID' in os.environ:
+ # jobnumber = os.environ['PBS_JOBID'].split('.')[0]
+ #else:
+ jobnumber = ''
+
+ outFile = '' if mdesc.scriptname == None else mdesc.scriptname.split('.')[0] + jobnumber
+
+ if revert is not None:
+ print "reverting to use PhysicalMemory"
+ self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
+ else:
+ print "using DRAMsimII"
+ self.physmem = M5dramSystem(extraParameters=extraParameters,
+ settingsFile=settingsFilename,
+ outFilename=outFile,
+ commandLine=outFile,
+ range=AddrRange(mdesc.mem()))
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+ self.physmem.port = self.membus.port
+ self.disk0 = CowIdeDisk(driveID='master')
+ self.disk2 = CowIdeDisk(driveID='master')
+ self.disk0.childImage(mdesc.disk())
+ self.disk2.childImage(disk('linux-bigswap2.img'))
+ self.tsunami = BaseTsunami()
+ self.tsunami.attachIO(self.iobus)
+ self.tsunami.ide.pio = self.iobus.port
+ self.tsunami.ethernet.pio = self.iobus.port
+ self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),read_only = True))
+ self.intrctrl = IntrControl()
+ self.mem_mode = mem_mode
+ self.terminal = Terminal()
+ self.kernel = binary('vmlinux')
+ self.pal = binary('ts_osfpal')
+ self.console = binary('console')
+ self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
+
+ return self
+
+# 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)
+
+parser = optparse.OptionParser()
+
+# System options
+parser.add_option("--kernel", action="store", type="string")
+parser.add_option("--script", action="store", type="string")
+
+# Benchmark options
+parser.add_option("--dual", action="store_true",
+ help="Simulate two systems attached with an ethernet link")
+parser.add_option("-b", "--benchmark", action="store", type="string",
+ dest="benchmark",
+ help="Specify the benchmark to run. Available benchmarks: %s"\
+ % DefinedBenchmarks)
+
+# DRAMsimII specific options
+parser.add_option("-f", "--DRAMsimConfig",
+ default="",
+ help="The DRAMsimII config file.")
+
+parser.add_option("--mp",
+ default="", help="Override default memory parameters with this switch")
+
+parser.add_option("--revert", action="store_true")
+
+parser.add_option("--nopre", action="store_true")
+
+# Metafile options
+parser.add_option("--etherdump", action="store", type="string", dest="etherdump",
+ help="Specify the filename to dump a pcap capture of the" \
+ "ethernet traffic")
+
+
+execfile(os.path.join(config_root, "common", "Options.py"))
+
+(options, args) = parser.parse_args()
+
+options.l2cache = True
+options.caches = True
+options.detailed = False
+
+if args:
+ print "Error: script doesn't take any positional arguments"
+ sys.exit(1)
+
+# driver system CPU is always simple... note this is an assignment of
+# a class, not an instance.
+DriveCPUClass = AtomicSimpleCPU
+drive_mem_mode = 'atomic'
+
+# system under test can be any CPU
+(TestCPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
+
+TestCPUClass.clock = '6GHz'
+DriveCPUClass.clock = '6GHz'
+
+if options.benchmark:
+ try:
+ bm = Benchmarks[options.benchmark]
+ except KeyError:
+ print "Error benchmark %s has not been defined." % options.benchmark
+ print "Valid benchmarks are: %s" % DefinedBenchmarks
+ sys.exit(1)
+else:
+ if options.dual:
+ bm = [SysConfig(), SysConfig()]
+ else:
+ bm = [SysConfig('','512MB')]
+
+np = options.num_cpus
+
+if buildEnv['TARGET_ISA'] == "alpha":
+ test_sys = makeDramSimLinuxAlphaSystem(test_mem_mode, bm[0], options.mp, options.DRAMsimConfig, options.revert)
+elif buildEnv['TARGET_ISA'] == "mips":
+ test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "sparc":
+ test_sys = makeSparcSystem(test_mem_mode, bm[0])
+elif buildEnv['TARGET_ISA'] == "x86":
+ test_sys = makeLinuxX86System(test_mem_mode, bm[0])
+else:
+ m5.panic("incapable of building non-alpha or non-sparc full system!")
+
+if options.kernel is not None:
+ test_sys.kernel = binary(options.kernel)
+
+if options.script is not None:
+ test_sys.readfile = options.script
+
+if options.l2cache:
+ if options.nopre is True:
+ print "no prefetcher"
+ test_sys.l2 = L2Cache(size='512kB', assoc=16, latency="4ns", mshrs = 32)
+ else:
+ #print "using prefetcher"
+ #test_sys.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs=32, prefetch_policy='ghb', prefetch_degree=3, prefetcher_size=256, tgts_per_mshr=24, prefetch_cache_check_push=False)
+ #test_sys.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs=32, prefetch_policy='stride', prefetch_degree=2, prefetcher_size=64, prefetch_cache_check_push=True)
+ #test_sys.l2 = L2Cache(size='1MB', assoc=16, latency="7ns", mshrs=32, prefetch_policy='ghb', prefetch_degree=2, prefetcher_size=16)
+ test_sys.l2 = L2Cache(size='8MB', assoc=16, latency="49ns")
+ #test_sys.l2 = L2Cache(size='8MB', assoc=16, latency="49ns", mshrs=32, prefetch_policy='ghb', prefetch_degree=3, prefetcher_size=256, tgts_per_mshr=24)
+
+ test_sys.tol2bus = Bus()
+ test_sys.l2.cpu_side = test_sys.tol2bus.port
+ test_sys.l2.mem_side = test_sys.membus.port
+
+test_sys.cpu = [TestCPUClass(cpu_id=i) for i in xrange(np)]
+
+if options.caches or options.l2cache:
+ test_sys.bridge.filter_ranges_a=[AddrRange(0, Addr.max)]
+ test_sys.bridge.filter_ranges_b=[AddrRange(0, size='8GB')]
+ test_sys.iocache = IOCache(addr_range=AddrRange(0, size='8GB'))
+ test_sys.iocache.cpu_side = test_sys.iobus.port
+ test_sys.iocache.mem_side = test_sys.membus.port
+
+for i in xrange(np):
+ if options.caches:
+ test_sys.cpu[i].addPrivateSplitL1Caches(L1Cache(size = '32kB', latency="4ns", mshrs = 12, tgts_per_mshr = 6),
+ L1Cache(size = '32kB', latency="4ns", prefetch_policy='ghb', prefetch_degree=2, prefetcher_size=16))
+ #test_sys.cpu[i].addPrivateSplitL1Caches(L1Cache(size = '64kB', latency="500ps"),
+ # L1Cache(size = '64kB', latency="500ps"))
+ if options.l2cache:
+ test_sys.cpu[i].connectMemPorts(test_sys.tol2bus)
+ else:
+ test_sys.cpu[i].connectMemPorts(test_sys.membus)
+
+ if options.fastmem:
+ test_sys.cpu[i].physmem_port = test_sys.physmem.port
+
+if buildEnv['TARGET_ISA'] == 'mips':
+ setMipsOptions(TestCPUClass)
+
+if len(bm) == 2:
+ if m5.build_env['TARGET_ISA'] == 'alpha':
+ drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1])
+ elif m5.build_env['TARGET_ISA'] == 'mips':
+ drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1])
+ elif m5.build_env['TARGET_ISA'] == 'sparc':
+ drive_sys = makeSparcSystem(drive_mem_mode, bm[1])
+ elif m5.build.env['TARGET_ISA'] == 'x86':
+ drive_sys = makeX86System(drive_mem_mode, bm[1])
+ drive_sys.cpu = DriveCPUClass(cpu_id=0)
+ drive_sys.cpu.connectMemPorts(drive_sys.membus)
+ if options.fastmem:
+ drive_sys.cpu.physmem_port = drive_sys.physmem.port
+ if options.kernel is not None:
+ drive_sys.kernel = binary(options.kernel)
+
+ root = makeDualRoot(test_sys, drive_sys, options.etherdump)
+elif len(bm) == 1:
+ root = Root(system=test_sys)
+else:
+ print "Error I don't know how to create more than 2 systems."
+ sys.exit(1)
+print "running"
+Simulation.run(options, root, test_sys, FutureClass)
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/m5/configs/runme
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/m5/configs/runme Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,1 @@
+./build/ALPHA_FS/m5.fast ./configs/example/fs.py -n 4 --script=./configs/boot/bodytrack_4c_simsmall.rcS --detailed --caches --l3cache -F 5000000000
\ No newline at end of file
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/src/Address.hh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/src/Address.hh Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,120 @@
+// Copyright (C) 2010 University of Maryland.
+// This file is part of DRAMsimII.
+//
+// DRAMsimII is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// DRAMsimII is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with DRAMsimII. If not, see .
+
+#ifndef ADDRESS_HH
+#define ADDRESS_HH
+#pragma once
+
+#include "globals.hh"
+
+namespace DRAMsimII
+{
+
+ /// @brief This class logically represents several interpretations of a memory address
+ /// @details A class to store various representations of an address
+ /// The same address may be represented as a virtual address, physical address,
+ /// or as channel, rank, bank, column and row identifiers
+ class Address
+ {
+ public:
+ // This section defines the address mapping scheme
+ // The scheme dictates how a memory address is converted
+ // to rank, bank, row, col, byte
+ enum AddressMappingScheme
+ {
+ CLOSE_PAGE_BASELINE,
+ SDRAM_BASE_MAP,
+ SDRAM_HIPERF_MAP,
+ CLOSE_PAGE_BASELINE_OPT,
+ CLOSE_PAGE_LOW_LOCALITY,
+ CLOSE_PAGE_HIGH_LOCALITY,
+ INTEL845G_MAP,
+ BURGER_BASE_MAP
+ };
+
+ protected:
+ static unsigned channelAddressDepth; ///< the number of bits to represent all channels
+ static unsigned rankAddressDepth; ///< the number of bits to represent all ranks
+ static unsigned bankAddressDepth; ///< the number of bits to represent all banks
+ static unsigned rowAddressDepth; ///< the number of bits to represent all rows
+ static unsigned columnAddressDepth; ///< the number of bits to represent all columns
+ static unsigned columnSizeDepth; ///< the minimum block that can be addressed
+ static unsigned rowLowAddressDepth; ///< the number of bits to represent the lower portion of the row
+ static unsigned rowHighAddressDepth; ///< the number of bits to represent the upper portion of the row
+ static unsigned columnLowAddressDepth; ///< the number of bits to represent the lower portion of a column
+ static unsigned columnHighAddressDepth; ///< the number of bits to represent the upper portion of a column
+ static unsigned rankCount; ///< the number of ranks per DIMM
+ static AddressMappingScheme mappingScheme; ///< the mapping scheme to convert physical to logical addresses
+
+ unsigned virtualAddress; ///< the virtual address
+ PhysicalAddress physicalAddress; ///< the physical address
+
+ unsigned channel; ///< the enumerated channel id
+ unsigned dimm; ///< the dimm id
+ unsigned rank; ///< the rank id
+ unsigned bank; ///< the bank id
+ unsigned row; ///< the row id
+ unsigned column; ///< the column id
+
+ // functions
+ bool addressTranslation();
+ bool reverseAddressTranslation();
+ public:
+
+ // functions
+ PhysicalAddress static highestAddress();
+
+ // accessors
+ PhysicalAddress getPhysicalAddress() const { return physicalAddress; }
+ unsigned getChannel() const { return channel; }
+ unsigned getDimm() const { return dimm; }
+ unsigned getRank() const { return rank; }
+ unsigned getBank() const { return bank; }
+ unsigned getRow() const { return row; }
+ unsigned getColumn() const { return column; }
+
+ // mutators
+ void setPhysicalAddress(PhysicalAddress pa) { physicalAddress = pa; addressTranslation(); }
+ void setAddress(const unsigned channel, const unsigned rank, const unsigned bank, const unsigned row, const unsigned column);
+ void setAddress(const Address &rhs);
+ void setChannel(const unsigned value) { channel = value; }
+ void setRank(const unsigned value) { dimm = value / rankCount; rank = value; }
+ void setBank(const unsigned value) { bank = value; }
+ void setRow(const unsigned value) { row = value; }
+ void setColumn(const unsigned value) { column = value; }
+
+ // constructor
+ Address(); ///< the no-arg constructor
+ explicit Address(PhysicalAddress pA); ///< the constructor based on a physical address
+ explicit Address(const unsigned channel, const unsigned rank, const unsigned bank, const unsigned row, const unsigned column);
+
+ // initialize
+ void static initialize(const Settings &dramSettings);
+ void static initialize(const SystemConfiguration &systemConfig);
+ PhysicalAddress static maxAddress();
+
+ // friend
+ friend std::ostream &DRAMsimII::operator<<(std::ostream &os, const Address&);
+
+ // overloads
+ bool operator==(const Address& right) const;
+ bool operator!=(const Address& right) const;
+ };
+
+ std::ostream& operator<<(std::ostream&, const Address::AddressMappingScheme&);
+
+}
+#endif
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/src/Address.cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/src/Address.cc Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,852 @@
+// Copyright (C) 2010 University of Maryland.
+// This file is part of DRAMsimII.
+//
+// DRAMsimII is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// DRAMsimII is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with DRAMsimII. If not, see .
+
+#include "Address.hh"
+#include "Settings.hh"
+#include "SystemConfiguration.hh"
+
+#include
+#include
+#include
+#include
+#include
+
+using std::cerr;
+using std::pow;
+using std::endl;
+using std::setbase;
+using std::setw;
+using std::hex;
+using namespace DRAMsimII;
+
+// static member declaration
+unsigned Address::channelAddressDepth;
+unsigned Address::rankAddressDepth;
+unsigned Address::bankAddressDepth;
+unsigned Address::rowAddressDepth;
+unsigned Address::columnAddressDepth;
+unsigned Address::columnSizeDepth;
+unsigned Address::columnLowAddressDepth;
+unsigned Address::columnHighAddressDepth;
+unsigned Address::rowLowAddressDepth;
+unsigned Address::rowHighAddressDepth;
+unsigned Address::rankCount;
+Address::AddressMappingScheme Address::mappingScheme;
+
+Address::Address():
+ virtualAddress(UINT_MAX), physicalAddress(PHYSICAL_ADDRESS_MAX), channel(UINT_MAX), dimm(UINT_MAX),
+ rank(UINT_MAX), bank(UINT_MAX), row(UINT_MAX), column(UINT_MAX)
+{
+}
+
+Address::Address(PhysicalAddress pA) :
+ virtualAddress(0), physicalAddress(pA), channel(0), dimm(0), rank(0), bank(0), row(0), column(0)
+{
+#ifndef NDEBUG
+ bool result =
+#endif
+ addressTranslation();
+#ifndef NDEBUG
+ assert(result);
+#endif
+
+#ifdef DEBUG
+ unsigned oldCh = channel, oldDimm = dimm, oldRk = rank, oldBk = bank, oldRow = row, oldCol = column;
+ reverseAddressTranslation();
+ assert(oldCh == channel && oldDimm == dimm && oldRk == rank && oldBk == bank && oldRow == row && oldCol == column);
+ if (result)
+ {
+ assert((physicalAddress >> columnSizeDepth) == (pA >> columnSizeDepth));
+ }
+#endif
+}
+
+Address::Address(const unsigned channel, const unsigned rank, const unsigned bank, const unsigned row,
+ const unsigned column) :
+ virtualAddress(0), physicalAddress(0x00), channel(channel), dimm(rank / rankCount), rank(rank), bank(bank), row(
+ row), column(column)
+{
+ reverseAddressTranslation();
+
+#ifdef DEBUG
+ PhysicalAddress pA = physicalAddress;
+ addressTranslation();
+ assert((physicalAddress >> columnSizeDepth) == (pA >> columnSizeDepth));
+ assert(this->channel == channel && this->rank == rank && this->bank == bank && this->row == row && this->column == column);
+#endif
+}
+
+PhysicalAddress Address::maxAddress()
+{
+ return (1LL << (channelAddressDepth + rankAddressDepth + bankAddressDepth + rowAddressDepth + columnAddressDepth
+ + columnSizeDepth)) - 1;
+}
+
+void Address::initialize(const Settings &_settings)
+{
+ channelAddressDepth = log2(_settings.channelCount);
+ rankCount = _settings.rankCount;
+ rankAddressDepth = log2(_settings.rankCount * _settings.dimmCount);
+ bankAddressDepth = log2(_settings.bankCount);
+ rowAddressDepth = log2(_settings.rowCount);
+ columnAddressDepth = log2(_settings.columnCount);
+ //FIXME: shouldn't this already be set appropriately?
+ columnSizeDepth = log2(_settings.dramType == DRDRAM ? 16 : _settings.columnSize);
+ mappingScheme = _settings.addressMappingScheme;
+ //unsigned cachelineDepth = log2(_settings.cacheLineSize);
+ // assume the cacheline size is 64B
+ unsigned cachelineDepth = log2(64);
+ assert(cachelineDepth > columnSizeDepth);
+ columnLowAddressDepth = cachelineDepth - columnSizeDepth;
+ columnHighAddressDepth = columnAddressDepth - columnLowAddressDepth;
+ assert(rowAddressDepth > 3);
+ rowLowAddressDepth = 3;
+ rowHighAddressDepth = rowAddressDepth - 3;
+}
+
+void Address::initialize(const SystemConfiguration &systemConfig)
+{
+ channelAddressDepth = log2(systemConfig.getChannelCount());
+ rankAddressDepth = log2(systemConfig.getRankCount());
+ bankAddressDepth = log2(systemConfig.getBankCount());
+ rowAddressDepth = log2(systemConfig.getRowCount());
+ columnAddressDepth = log2(systemConfig.getColumnCount());
+ //FIXME: shouldn't this already be set appropriately?
+ columnSizeDepth = log2(systemConfig.getDRAMType() == DRDRAM ? 16 : systemConfig.getColumnSize());
+ mappingScheme = systemConfig.getAddressMappingScheme();
+ //unsigned cachelineDepth = log2(systemConfig.getCachelineSize());
+ // assume the cacheline size is 64B
+ unsigned cachelineDepth = log2(64);
+ assert(cachelineDepth > columnSizeDepth);
+ columnLowAddressDepth = cachelineDepth - columnSizeDepth;
+ columnHighAddressDepth = columnAddressDepth - columnLowAddressDepth;
+ assert(rowAddressDepth > 3);
+ rankCount = systemConfig.getRankCount();
+ rowLowAddressDepth = 3;
+ rowHighAddressDepth = rowAddressDepth - 3;
+}
+
+bool Address::reverseAddressTranslation()
+{
+ unsigned columnLow = column & ((1 << columnLowAddressDepth) - 1);
+ unsigned columnHigh = column >> columnLowAddressDepth;
+ unsigned shift = columnSizeDepth;
+
+ switch (mappingScheme)
+ {
+ case SDRAM_HIPERF_MAP:
+
+ physicalAddress = (PhysicalAddress) columnLow << shift;
+ shift += columnLowAddressDepth;
+ physicalAddress |= (PhysicalAddress) channel << shift;
+ shift += channelAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnHigh << shift;
+ shift += columnHighAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += bankAddressDepth;
+ physicalAddress |= (PhysicalAddress) rank << shift;
+ shift += rankAddressDepth;
+ physicalAddress |= (PhysicalAddress) row << shift;
+
+ break;
+ case SDRAM_BASE_MAP:
+
+ physicalAddress = (PhysicalAddress) columnLow << shift;
+ shift += columnLowAddressDepth;
+ physicalAddress |= (PhysicalAddress) channel << shift;
+ shift += channelAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnHigh << shift;
+ shift += columnHighAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += bankAddressDepth;
+ physicalAddress |= (PhysicalAddress) row << shift;
+ shift += rowAddressDepth;
+ physicalAddress |= (PhysicalAddress) rank << shift;
+
+ break;
+ case CLOSE_PAGE_BASELINE:
+
+ physicalAddress = (PhysicalAddress) columnLow << shift;
+ shift += columnLowAddressDepth;
+ physicalAddress |= (PhysicalAddress) channel << shift;
+ shift += channelAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += bankAddressDepth;
+ physicalAddress |= (PhysicalAddress) rank << shift;
+ shift += rankAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnHigh << shift;
+ shift += columnHighAddressDepth;
+ physicalAddress |= (PhysicalAddress) row << shift;
+
+ break;
+
+ case CLOSE_PAGE_BASELINE_OPT:
+ {
+ unsigned rowLow = row & 0x07;
+ unsigned rowHigh = row >> 3;
+ physicalAddress = (PhysicalAddress) columnLow << shift;
+ shift += columnLowAddressDepth;
+ physicalAddress |= (PhysicalAddress) channel << shift;
+ shift += channelAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += bankAddressDepth;
+ physicalAddress |= (PhysicalAddress) rowLow << shift;
+ shift += 3;
+ physicalAddress |= (PhysicalAddress) rank << shift;
+ shift += rankAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnHigh << shift;
+ shift += columnHighAddressDepth;
+ physicalAddress |= (PhysicalAddress) rowHigh << shift;
+
+ break;
+ }
+ case CLOSE_PAGE_LOW_LOCALITY:
+
+ physicalAddress = (PhysicalAddress) channel << shift;
+ shift += channelAddressDepth;
+ physicalAddress |= (PhysicalAddress) rank << shift;
+ shift += rankAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += bankAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnLow << shift;
+ shift += columnLowAddressDepth;
+ physicalAddress |= (PhysicalAddress) row << shift;
+ shift += rowAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnHigh << shift;
+
+ break;
+
+ case CLOSE_PAGE_HIGH_LOCALITY:
+
+ physicalAddress = (PhysicalAddress) columnLow << shift;
+ shift += columnLowAddressDepth;
+ physicalAddress |= (PhysicalAddress) row << shift;
+ shift += rowAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnHigh << shift;
+ shift += columnHighAddressDepth;
+ physicalAddress |= (PhysicalAddress) channel << shift;
+ shift += channelAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += bankAddressDepth;
+ physicalAddress |= (PhysicalAddress) rank << shift;
+
+ break;
+
+ case INTEL845G_MAP:
+
+ physicalAddress = (PhysicalAddress) column << 10;
+ shift += columnLowAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += rowAddressDepth;
+ physicalAddress |= (PhysicalAddress) columnHigh << shift;
+ shift += columnHighAddressDepth;
+ physicalAddress |= (PhysicalAddress) channel << shift;
+ shift += channelAddressDepth;
+ physicalAddress |= (PhysicalAddress) bank << shift;
+ shift += bankAddressDepth;
+ physicalAddress |= (PhysicalAddress) rank << shift;
+
+ break;
+
+ case BURGER_BASE_MAP:
+ break;
+
+ default:
+ break;
+ }
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////////
+/// @brief converts a given memory request from a physical address to a rank/bank/row/column representation
+/// @details converts according to the address mapping scheme in systemConfig
+/// @author Joe Gross
+/// @return true if the conversion was successful, false if there was some problem
+//////////////////////////////////////////////////////////////////////
+bool Address::addressTranslation()
+{
+ if (!physicalAddress)
+ return false;
+
+ // strip away the byte address portion
+ PhysicalAddress tempAddress = physicalAddress >> columnSizeDepth;
+
+ switch (mappingScheme)
+ {
+ case SDRAM_HIPERF_MAP:
+ /*
+ * High performance SDRAM Mapping scheme
+ * 5
+ * |<-------------------->| |<->| |<->| |<--------------->| |<---->| |<---------------->| |<------------------->|
+ * row id rank bank col_id(high) chan_id col_id(low) column size
+ * intlog2(cacheline_size) intlog2(channel_width)
+ * - intlog2(channel_width)
+ * Rationale is as follows: From LSB to MSB
+ * min column size is the channel width, and individual byes within that "unit" is not addressable, so strip it out and throw it away.
+ * Then strip out a few bits of phys_addr address for the low order bits of col_id. We basically want consecutive cachelines to
+ * map to different channels.
+ * Then strip out the bits for channel id.
+ * Then strip out the bits for the high order bits of the column id.
+ * Then strip out the bank_id.
+ * Then strip out the rank_id.
+ * What remains must be the row_id
+ *
+ * As applied to system (1 dram channel, 64 bit wide. 4 ranks of 256 Mbit chips, each x16. 512 MB system)
+ *
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<------------------------------->| |<->| |<->| |<------------------------>| |<--->|
+ * row id rank bank Column id (8B wide)
+ * id id 2KB * 4 / 8B Byte Addr
+ *
+ * As applied to system (2 dram channel, 64 bit wide each. 1 GB system)
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<------------------------------->| |<->| |<->| |<---------------->| ^ |<--->| |<--->|
+ * row id rank bank Column id high chan col_id (8B wide)
+ * id id 2KB * 4 / 8B id low Byte Addr
+ *
+ * As applied to system (1 dram channel, 128 bit wide. 1 GB system)
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<------------------------------->| |<->| |<->| |<------------------------->| |<------>|
+ * row id rank bank Column id (16B wide)
+ * id id 2KB * 4 / 8B Byte Addr
+ *
+ * As applied to system (2 dram channel, 128 bit wide each. 2 GB system)
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<------------------------------->| |<->| |<->| |<------------------->| ^ |<>| |<------>|
+ * row id rank bank Column id high chan col (16B wide)
+ * id id 2KB * 4 / 8B id idlo Byte Addr
+ *
+ */
+ {
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= columnLowAddressDepth;
+ unsigned columnLow = tempAddress << columnLowAddressDepth ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= channelAddressDepth;
+ channel = (tempAddress << channelAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= columnHighAddressDepth;
+ unsigned columnHigh = (tempAddress << columnHighAddressDepth) ^ buffer;
+
+ column = (columnHigh << columnLowAddressDepth) | columnLow;
+
+ buffer = tempAddress;
+ tempAddress >>= bankAddressDepth;
+ bank = (tempAddress << bankAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= rankAddressDepth;
+ rank = (tempAddress << rankAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= rowAddressDepth;
+ row = (tempAddress << rowAddressDepth) ^ buffer;
+ }
+ break;
+
+ case SDRAM_BASE_MAP:
+ /*
+ * Basic SDRAM Mapping scheme (As found on user-upgradeable memory systems)
+ * 5
+ * |<---->| |<------------------->| |<->| |<--------------->| |<---->| |<---------------->| |<------------------->|
+ * rank row id bank col_id(high) chan_id col_id(low) column size
+ * intlog2(cacheline_size) intlog2(channel_width)
+ * - intlog2(channel_width)
+ * Rationale is as follows: From LSB to MSB
+ * min column size is the channel width, and individual byes within that "unit" is not addressable, so strip it out and throw it away.
+ * Then strip out a few bits of phys_addr address for the low order bits of col_id. We basically want consecutive cachelines to
+ * map to different channels.
+ * Then strip out the bits for channel id.
+ * Then strip out the bits for the high order bits of the column id.
+ * Then strip out the bank_id.
+ * Then strip out the row_id
+ * What remains must be the rankid
+ *
+ * As applied to system (2 dram channel, 64 bit wide each. 1 GB system)
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<->| |<------------------------------->| |<->| |<---------------->| ^ |<--->| |<--->|
+ * rank row id bank Column id high chan col_id (8B wide)
+ * id id 2KB * 4 / 8B id low Byte Addr
+ *
+ * As applied to system (1 dram channel, 128 bit wide. 1 GB system)
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<->| |<------------------------------->| |<->| |<------------------------->| |<------>|
+ * rank row id bank Column id (16B wide)
+ * id id 2KB * 4 / 8B id low Byte Addr
+ *
+ */
+ {
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= columnLowAddressDepth;
+ unsigned columnLow = (tempAddress << columnLowAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= channelAddressDepth;
+ channel = (tempAddress << channelAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= columnHighAddressDepth;
+ unsigned columnHigh = (tempAddress << columnHighAddressDepth) ^ buffer;
+
+ column = (columnHigh << columnLowAddressDepth) | columnLow;
+
+ buffer = tempAddress;
+ tempAddress >>= bankAddressDepth;
+ bank = (tempAddress << bankAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= rowAddressDepth;
+ row = (tempAddress << rowAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= rankAddressDepth;
+ rank = (tempAddress << rankAddressDepth) ^ buffer;
+ }
+ break;
+
+ case CLOSE_PAGE_BASELINE:
+ /*
+ * High performance closed page SDRAM Mapping scheme
+ * 5
+ * |<------------------>| |<------------>| |<---->| |<---->| |<---->| |<----------------->| |<------------------->|
+ * row id col_id(high) rank bank chan col_id(low) column size
+ * intlog2(cacheline_size) intlog2(channel_width)
+ * - intlog2(channel_width)
+ *
+ * Rationale is as follows: From LSB to MSB
+ * min column size is the channel width, and individual byes within that "unit" is not addressable, so strip it out and throw it away.
+ * Then strip out a few bits of phys_addr address for the low order bits of col_id. We basically want consecutive cachelines to
+ * map to different channels.
+ * Then strip out the bits for channel id.
+ * Then strip out the bank_id.
+ * Then strip out the rank_id.
+ * Then strip out the bits for the high order bits of the column id.
+ * What remains must be the row_id
+ *
+ * As applied to system (1 dram channel, 64 bit wide each. 2 GB system)
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<------------------------------------->| |<---------------->| ^ |<--->| |<--->| |<--->|
+ * row id Column id high rank bank col_id (8B wide)
+ * 1KB / 8B id id low Byte Addr
+ */
+ {
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= columnLowAddressDepth;
+
+ // strip out the column low address
+ unsigned columnLow = buffer ^ (tempAddress << columnLowAddressDepth);
+
+ buffer = tempAddress; /* save away original address */
+ tempAddress >>= channelAddressDepth;
+ // strip out the channel address
+ channel = buffer ^ (tempAddress << channelAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= bankAddressDepth;
+ // strip out the bank address
+ bank = buffer ^ (tempAddress << bankAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= rankAddressDepth;
+ // strip out the rank address
+ rank = buffer ^ (tempAddress << rankAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= columnHighAddressDepth;
+ // strip out the column hi address
+ unsigned columnHigh = buffer ^ (tempAddress << columnHighAddressDepth);
+
+ column = (columnHigh << columnLowAddressDepth) | columnLow;
+
+ buffer = tempAddress;
+ tempAddress >>= rowAddressDepth;
+ // strip out the row address
+ row = buffer ^ (tempAddress << rowAddressDepth);
+ }
+ break;
+
+ case CLOSE_PAGE_BASELINE_OPT:
+ {
+ /*
+ * High performance closed page SDRAM Mapping scheme
+ * 5
+ * |<----------->||<------------>||<------>||<----->||<---->||<---->||<----------------->||<------------------->|
+ * row_high col_id(high) rank row_lo bank chan col_id(low) column size
+ *
+ * intlog2(cacheline_size) intlog2(channel_width)
+ * - intlog2(channel_width)
+ *
+ * Rationale is as follows: From LSB to MSB
+ * min column size is the channel width, and individual byes within that "unit" is not addressable, so strip it out and throw it away.
+ * Then strip out a few bits of phys_addr address for the low order bits of col_id. We basically want consecutive cachelines to
+ * map to different channels.
+ * Then strip out the bits for channel id.
+ * Then strip out the bank_id.
+ * Then strip out the rank_id.
+ * Then strip out the bits for the high order bits of the column id.
+ * What remains must be the row_id
+ *
+ * As applied to system (1 dram channel, 64 bit wide each. 2 GB system)
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<------------------------------------->| |<---------------->| ^ |<--->| |<--->| |<--->|
+ * row id Column id high rank bank col_id (8B wide)
+ * 1KB / 8B id id low Byte Addr
+ */
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= columnLowAddressDepth;
+
+ // strip out the column low address
+ unsigned columnLow = buffer ^ (tempAddress << columnLowAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= channelAddressDepth;
+ // strip out the channel address
+ channel = buffer ^ (tempAddress << channelAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= bankAddressDepth;
+ // strip out the bank address
+ bank = buffer ^ (tempAddress << bankAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= 3;
+ unsigned rowLow = buffer ^ (tempAddress << 3);
+
+ buffer = tempAddress;
+ tempAddress >>= rankAddressDepth;
+ // strip out the rank address
+ rank = buffer ^ (tempAddress << rankAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= columnHighAddressDepth;
+ // strip out the column hi address
+ unsigned columnHigh = buffer ^ (tempAddress << columnHighAddressDepth);
+
+ column = (columnHigh << columnLowAddressDepth) | columnLow;
+
+ buffer = tempAddress;
+ tempAddress >>= (rowAddressDepth - 3);
+ // strip out the row address
+ unsigned rowHigh = buffer ^ (tempAddress << (rowAddressDepth - 3));
+
+ row = (rowHigh << 3) | rowLow;
+
+ break;
+ }
+
+ case CLOSE_PAGE_LOW_LOCALITY:
+ /*
+ * High performance closed page SDRAM Mapping scheme for streams with low locality
+ * 5
+ * |<------------------>| |<------------>| |<---------->| |<----->| |<----->| |<------>| |<------------------->|
+ * col_id(high) row col_id(low) bank rank chan column size
+ * intlog2(cacheline_size) intlog2(channel_width)
+ * - intlog2(channel_width)
+ */
+ {
+
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= channelAddressDepth;
+ // strip out the channel address
+ channel = buffer ^ (tempAddress << channelAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= rankAddressDepth;
+ // strip out the rank address
+ rank = buffer ^ (tempAddress << rankAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= bankAddressDepth;
+ // strip out the bank address
+ bank = buffer ^ (tempAddress << bankAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= columnLowAddressDepth;
+ // strip out the column low address
+ unsigned columnLow = buffer ^ (tempAddress << columnLowAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= rowAddressDepth;
+ // strip out the row address
+ row = buffer ^ (tempAddress << rowAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= columnHighAddressDepth;
+ // strip out the column hi address
+ unsigned columnHigh = buffer ^ (tempAddress << columnHighAddressDepth);
+
+ column = (columnHigh << columnLowAddressDepth) | columnLow;
+ }
+ break;
+
+ case CLOSE_PAGE_HIGH_LOCALITY:
+ /*
+ * High performance closed page SDRAM Mapping scheme for streams with low locality
+ * 5
+ * |<------->| |<------->| |<----->| |<-------------->| |<----->| |<--------------->| |<----------------->|
+ * rank bank chan col_id(high) row col_id(low) column size
+ * intlog2(cacheline_size) intlog2(channel_width)
+ * - intlog2(channel_width)
+ */
+ {
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= columnLowAddressDepth;
+ // strip out the column low address
+ unsigned columnLow = buffer ^ (tempAddress << columnLowAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= rowAddressDepth;
+ // strip out the row address
+ row = buffer ^ (tempAddress << rowAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= columnHighAddressDepth;
+ // strip out the column hi address
+ unsigned columnHigh = buffer ^ (tempAddress << columnHighAddressDepth);
+
+ column = (columnHigh << columnLowAddressDepth) | columnLow;
+
+ buffer = tempAddress;
+ tempAddress >>= channelAddressDepth;
+ // strip out the channel address
+ channel = buffer ^ (tempAddress << channelAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= bankAddressDepth;
+ // strip out the bank address
+ bank = buffer ^ (tempAddress << bankAddressDepth);
+
+ buffer = tempAddress;
+ tempAddress >>= rankAddressDepth;
+ // strip out the rank address
+ rank = buffer ^ (tempAddress << rankAddressDepth);
+ }
+
+ break;
+
+ case INTEL845G_MAP:
+ {
+
+ /* Data comes from Intel's 845G Datasheets. Table 5-5
+ * DDR SDRAM mapping only.
+ *
+ * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ * |<->| |<---------------------------------->| |<->| |<------------------------->| |<--->|
+ * rank row id bank Column id (64 bit wide bus)
+ * id id 2KB * 4 / 8B Byte addr
+ * row id goes like this: addr[27:15:26-16]
+ * rank_id is addr[29:28] This means that no device switching unless memory usage goes above 256MB grainularity
+ * No need to remap address with variable number of ranks. Address just goes up to rank id, if there is more than XXX MB of memory.
+ * Drawback to this scheme is that we're not effectively using banks.
+ */
+ //tempAddress = physicalAddress >> 3;
+ tempAddress = physicalAddress;
+
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= 10;
+ // 11-3
+ column = (tempAddress << 10) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= 2;
+ // 14:13
+ bank = (tempAddress << 2) ^ buffer;
+
+ buffer = physicalAddress >> 15;
+ tempAddress = buffer >> 1;
+ // 15
+ unsigned bit_15 = (tempAddress << 1) ^ buffer;
+
+ buffer = physicalAddress >> 16;
+ tempAddress = buffer >> 11;
+ // 26:16
+ unsigned bits_26_to_16 = (tempAddress << 11) ^ buffer;
+
+ buffer = physicalAddress >> 27;
+ tempAddress = buffer >> 1;
+ // 27
+ unsigned bit_27 = (tempAddress << 1) ^ buffer;
+
+ row = (bit_27 << 13) | (bit_15 << 12) | bits_26_to_16;
+
+ buffer = physicalAddress >> 28;
+ tempAddress = buffer >> 2;
+ // 29:28
+ rank = (tempAddress << 2) ^ buffer;
+
+ // Intel 845G has only a single channel dram controller
+ channel = 0;
+
+ }
+ break;
+
+ case BURGER_BASE_MAP: // Good for only Rambus memory really
+
+ // BURGER BASE :
+ // |<-------------------------------->|<------>|<------>|<---------------->|<----------------->|<----------->|
+ // row id bank id Rank id Column id Channel id Byte Address
+ // DRAM page size/ intlog2(chan. count) within packet
+ // Bus Width used if chan. > 1
+ //
+ // As applied to system (1 chan) using 256 Mbit RDRAM chips:
+ // 512 rows X 32 banks X 128 columns X 16 bytes per column.
+ // 16 ranks gets us to 512 MByte.
+ //
+ // 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ // |<---------------------->| |<---------->| |<------->| |<---------------->| |<------>|
+ // row id bank rank Col id 16 byte
+ // (512 rows) id id 2KB/16B packet
+ {
+ PhysicalAddress buffer = tempAddress;
+ tempAddress >>= channelAddressDepth;
+ channel = (tempAddress << channelAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= columnAddressDepth;
+ column = (tempAddress << columnAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= rankAddressDepth;
+ rank = (tempAddress << rankAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= bankAddressDepth;
+ bank = (tempAddress << bankAddressDepth) ^ buffer;
+
+ buffer = tempAddress;
+ tempAddress >>= rowAddressDepth;
+ row = (tempAddress << rowAddressDepth) ^ buffer;
+
+ }
+ break;
+
+ // don't know what this policy is.. Map everything to 0
+ default:
+ cerr << "Unknown address mapping scheme, mapping chan, rank, bank to zero: ";
+ cerr << mappingScheme;
+ cerr << endl;
+ channel = rank = bank = row = column = 0;
+ return false;
+ break;
+ }
+
+ dimm = rank / rankCount;
+
+ // If there is still "stuff" left, the input address is out of range
+ if (tempAddress)
+ {
+ cerr << "Memory address (" << std::hex << physicalAddress
+ << ") out of range of available physical memory, max(" << highestAddress() << ")" << endl;
+ return false;
+ }
+
+ return true;
+}
+
+PhysicalAddress Address::highestAddress()
+{
+ return ((PhysicalAddress) 1 << (columnLowAddressDepth + columnHighAddressDepth + channelAddressDepth
+ + rankAddressDepth + bankAddressDepth + rowAddressDepth + columnSizeDepth)) - 1;
+}
+
+void Address::setAddress(const unsigned channel, const unsigned rank, const unsigned bank, const unsigned row,
+ const unsigned column)
+{
+ this->channel = channel;
+ this->rank = rank;
+ this->bank = bank;
+ this->column = column;
+ this->row = row;
+ this->dimm = rank / rankCount;
+
+ reverseAddressTranslation();
+
+#ifdef DEBUG
+ PhysicalAddress oldPA = physicalAddress;
+ addressTranslation();
+ assert((physicalAddress >> columnSizeDepth) == (oldPA >> columnSizeDepth));
+ assert(this->channel == channel && this->rank == rank && this->bank == bank && this->row == row && this->column == column);
+#endif
+
+}
+
+void Address::setAddress(const Address &rhs)
+{
+ channel = rhs.channel;
+ rank = rhs.rank;
+ bank = rhs.bank;
+ column = rhs.column;
+ row = rhs.row;
+ dimm = rhs.rank / rankCount;
+}
+
+std::ostream &DRAMsimII::operator <<(std::ostream &os, const Address& thisAddress)
+{
+ return os << "addr[0x" << hex << thisAddress.physicalAddress << "] chan[" << setbase(16) << thisAddress.channel
+ << "] dimm[" << setbase(16) << thisAddress.dimm << "] rank[" << setbase(16) << thisAddress.rank
+ << "] bank[" << setbase(16) << thisAddress.bank << "] row[" << setbase(16) << thisAddress.row
+ << "] col[" << setbase(16) << thisAddress.column << "]";
+}
+
+std::ostream &DRAMsimII::operator <<(std::ostream &os, const Address::AddressMappingScheme &mappingScheme)
+{
+ switch (mappingScheme)
+ {
+ case Address::BURGER_BASE_MAP:
+ os << "BBM";
+ break;
+ case Address::SDRAM_HIPERF_MAP:
+ os << "SDHIPF";
+ break;
+ case Address::SDRAM_BASE_MAP:
+ os << "SDBAS";
+ break;
+ case Address::CLOSE_PAGE_BASELINE:
+ os << "CPBAS";
+ break;
+ case Address::CLOSE_PAGE_BASELINE_OPT:
+ os << "CPBOPT";
+ break;
+ case Address::INTEL845G_MAP:
+ os << "845G";
+ break;
+ case Address::CLOSE_PAGE_LOW_LOCALITY:
+ os << "LOLOC";
+ break;
+ case Address::CLOSE_PAGE_HIGH_LOCALITY:
+ os << "HILOC";
+ break;
+ default:
+ os << "UNKWN";
+ break;
+ }
+ return os;
+}
+
+// overloads
+bool Address::operator==(const Address& right) const
+{
+ return channel == right.channel && rank == right.rank && bank == right.bank && row == right.row && column
+ == right.column;
+}
+
+bool Address::operator!=(const Address& right) const
+{
+ return !(*this == right);
+}
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/src/Bank.hh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/src/Bank.hh Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,135 @@
+// Copyright (C) 2010 University of Maryland.
+// This file is part of DRAMsimII.
+//
+// DRAMsimII is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// DRAMsimII is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with DRAMsimII. If not, see .
+
+#ifndef BANK_HH
+#define BANK_HH
+
+#include "globals.hh"
+#include "command.hh"
+#include "Settings.hh"
+#include "transaction.hh"
+#include "command.hh"
+#include "TimingSpecification.hh"
+#include "SystemConfiguration.hh"
+#include "queue.hh"
+#include "Statistics.hh"
+
+namespace DRAMsimII
+{
+ /// @brief this class logically represents a bank
+ /// @details contains per bank queues as well as stats about when events happened
+ class Bank
+ {
+ private:
+ const TimingSpecification &timing; ///< a reference to the timing specification
+ const SystemConfiguration &systemConfig;///< reference to the system config to obtain specs
+ Statistics &statistics; ///< backward pointer to the stats engine
+ protected:
+
+ // members
+ Queue perBankQueue; ///< the command priority queue, stores the commands to be executed
+ tick lastRASTime; ///< when did last RAS command start?
+ tick lastCASTime; ///< when did last CAS command start?
+ tick lastCASWTime; ///< when did last CASW command start?
+ tick lastPrechargeTime; ///< when did last Precharge command start?
+ unsigned lastCASLength; ///< the length of the last CAS command issued
+ unsigned lastCASWLength; ///< the length of the last CASW command issued
+
+ tick nextActivateTime; ///< the time at which an ACT may be sent to this rank
+ tick nextReadTime; ///< the time at which a CAS may be sent to this rank
+ tick nextWriteTime; ///< the time at which a CASW may be sent to this rank
+ tick nextPrechargeTime; ///< the time at which a Pre may be sent to this rank
+
+ unsigned openRowID; ///< if the bank is open, what is the row id?
+ bool activated; ///< if the bank is activated, else precharged
+
+ // stats
+ unsigned RASCount; ///< the total number of RAS commands in this epoch
+ unsigned totalRASCount; ///< the number of RAS commands
+ unsigned CASCount; ///< the total number of CAS commands in this epoch
+ unsigned totalCASCount; ///< the number of CAS commands
+ unsigned CASWCount; ///< the total number of CAS+W commands in this epoch
+ unsigned totalCASWCount; ///< the number of CASW commands
+
+ public:
+ // functions
+ void issueRAS(const tick currentTime, const Command *currentCommand);
+ void issuePRE(const tick currentTime, const Command *currentCommand);
+ void issueCAS(const tick currentTime, const Command *currentCommand);
+ void issueCASW(const tick currentTime, const Command *currentCommand);
+ void issueREF();
+ void accumulateAndResetCounts() { totalRASCount += RASCount; totalCASCount += CASCount; totalCASWCount += CASWCount; RASCount = CASWCount = CASCount = 0; }
+ void resetToTime(const tick time);
+ tick next(Command::CommandType nextCommandType) const;
+
+ // accessors
+ tick getLastRasTime() const { return lastRASTime; }
+ tick getLastCasTime() const { return lastCASTime; }
+ tick getLastCaswTime() const {return lastCASWTime; }
+
+ tick getLastPrechargeTime() const { return lastPrechargeTime; }
+
+ unsigned getLastCasLength() const { return lastCASLength; }
+ unsigned getLastCaswLength() const { return lastCASWLength; }
+
+ unsigned getOpenRowID() const { return openRowID; }
+ bool isActivated() const { return activated; }
+
+ unsigned getRASCount() const { return RASCount; }
+ unsigned getCASCount() const { return CASCount; }
+ unsigned getCASWCount() const { return CASWCount; }
+
+ unsigned getTotalRASCount() const { return totalRASCount; }
+ unsigned getTotalCASCount() const { return totalCASCount; }
+ unsigned getTotalCASWCount() const { return totalCASWCount; }
+
+ Command *pop() { return perBankQueue.pop(); }
+ bool push(Command *value) { return perBankQueue.push(value); }
+ bool insert(Command *value, const int index) { return perBankQueue.insert(value, index); }
+ const Command *read(const unsigned value) const { return perBankQueue.read(value); }
+ const inline Command *front() const { return perBankQueue.front(); }
+ const Command *back() const { return perBankQueue.back(); }
+ unsigned size() const { return perBankQueue.size(); }
+ unsigned depth() const { return perBankQueue.depth(); }
+ Command::CommandType nextCommandType() const { return perBankQueue.front() ? perBankQueue.front()->getCommandType() : Command::INVALID_COMMAND; }
+ unsigned freeCommandSlots() const { return perBankQueue.freecount(); }
+ bool aggressiveInsert(Transaction *value, const tick time);
+ bool openPageAggressiveInsertCheck(const Transaction *value, const tick time) const;
+ bool closePageAggressiveInsertCheck(const Transaction *value, const tick time) const;
+ bool isFull() const { return perBankQueue.isFull(); }
+ bool isEmpty() const;
+ bool hasNoReadWrite() const;
+ bool isHighUtilization() const { return perBankQueue.size() > (perBankQueue.depth() / 2);}
+ void collapse();
+
+ // constructors
+ explicit Bank(const Settings& settings, const TimingSpecification &timingVal, const SystemConfiguration &systemConfigVal, Statistics& stats);
+ Bank(const Bank&, const TimingSpecification &timingVal, const SystemConfiguration &systemConfigVal, Statistics& stats);
+ Bank(const Bank&);
+
+ // overloads
+ bool operator==(const Bank& rhs) const;
+ Bank &operator=(const Bank& rhs);
+
+ friend std::ostream& operator<<(std::ostream& , const Bank&);
+
+ private:
+
+ explicit Bank(const TimingSpecification &timingVal, const SystemConfiguration &systemConfigVal, Statistics &stats);
+ };
+
+}
+#endif
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/src/Bank.cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/src/Bank.cc Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,578 @@
+// Copyright (C) 2010 University of Maryland.
+// This file is part of DRAMsimII.
+//
+// DRAMsimII is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// DRAMsimII is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with DRAMsimII. If not, see .
+
+#include "Bank.hh"
+#include
+
+using std::max;
+using std::cerr;
+using std::endl;
+
+using namespace DRAMsimII;
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief constructor with timing spec and system config values
+//////////////////////////////////////////////////////////////////////////
+Bank::Bank(const Settings& settings, const TimingSpecification &timingVal, const SystemConfiguration &systemConfigVal, Statistics &stats):
+timing(timingVal),
+systemConfig(systemConfigVal),
+statistics(stats),
+perBankQueue(settings.perBankQueueDepth),
+lastRASTime(-100),
+lastCASTime(-100),
+lastCASWTime(-100),
+lastPrechargeTime(-1ll * settings.tRP),
+lastCASLength(8),
+lastCASWLength(8),
+nextActivateTime(0),
+nextReadTime(0),
+nextWriteTime(0),
+nextPrechargeTime(0),
+openRowID(-1),
+activated(/*settings.rowBufferManagementPolicy == OPEN_PAGE*/true), // close page starts with RAS, open page starts with Pre
+RASCount(0),
+totalRASCount(0),
+CASCount(0),
+totalCASCount(0),
+CASWCount(0),
+totalCASWCount(0)
+{}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief copy constructor with timing spec and sysconfig information
+//////////////////////////////////////////////////////////////////////////
+Bank::Bank(const Bank &rhs, const TimingSpecification &timingVal, const SystemConfiguration &systemConfigVal, Statistics &stats):
+timing(timingVal),
+systemConfig(systemConfigVal),
+statistics(stats),
+perBankQueue(rhs.perBankQueue),
+lastRASTime(rhs.lastRASTime),
+lastCASTime(rhs.lastCASTime),
+lastCASWTime(rhs.lastCASWTime),
+lastPrechargeTime(rhs.lastPrechargeTime),
+lastCASLength(rhs.lastCASLength),
+lastCASWLength(rhs.lastCASWLength),
+nextActivateTime(rhs.nextActivateTime),
+nextReadTime(rhs.nextReadTime),
+nextWriteTime(rhs.nextWriteTime),
+nextPrechargeTime(rhs.nextPrechargeTime),
+openRowID(rhs.openRowID),
+activated(rhs.activated),
+RASCount(rhs.RASCount),
+totalRASCount(rhs.totalRASCount),
+CASCount(rhs.CASCount),
+totalCASCount(rhs.totalCASCount),
+CASWCount(rhs.CASWCount),
+totalCASWCount(rhs.totalCASWCount)
+{}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief copy constructor
+//////////////////////////////////////////////////////////////////////////
+Bank::Bank(const Bank &rhs):
+timing(rhs.timing),
+systemConfig(rhs.systemConfig),
+statistics(rhs.statistics),
+perBankQueue(rhs.perBankQueue),
+lastRASTime(rhs.lastRASTime),
+lastCASTime(rhs.lastCASTime),
+lastCASWTime(rhs.lastCASWTime),
+lastPrechargeTime(rhs.lastPrechargeTime),
+lastCASLength(rhs.lastCASLength),
+lastCASWLength(rhs.lastCASWLength),
+nextActivateTime(rhs.nextActivateTime),
+nextReadTime(rhs.nextReadTime),
+nextWriteTime(rhs.nextWriteTime),
+nextPrechargeTime(rhs.nextPrechargeTime),
+openRowID(rhs.openRowID),
+activated(rhs.activated),
+RASCount(rhs.RASCount),
+totalRASCount(rhs.totalRASCount),
+CASCount(rhs.CASCount),
+totalCASCount(rhs.totalCASCount),
+CASWCount(rhs.CASWCount),
+totalCASWCount(rhs.totalCASWCount)
+{}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief deserialization constructor
+//////////////////////////////////////////////////////////////////////////
+Bank::Bank(const TimingSpecification &timingVal, const SystemConfiguration &systemConfigVal, Statistics &stats):
+timing(timingVal),
+systemConfig(systemConfigVal),
+statistics(stats),
+perBankQueue(0),
+lastRASTime(0),
+lastCASTime(0),
+lastCASWTime(0),
+lastPrechargeTime(0),
+lastCASLength(0),
+lastCASWLength(0),
+nextActivateTime(0),
+nextReadTime(0),
+nextWriteTime(0),
+nextPrechargeTime(0),
+openRowID(0),
+activated(0),
+RASCount(0),
+totalRASCount(0),
+CASCount(0),
+totalCASCount(0),
+CASWCount(0),
+totalCASWCount(0)
+{}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief this logically issues a RAS command and updates all variables to reflect this
+//////////////////////////////////////////////////////////////////////////
+void Bank::issueRAS(const tick currentTime, const Command *currentCommand)
+{
+ // make sure activates follow precharges
+ assert(!activated);
+ assert(currentTime >= lastPrechargeTime + timing.tRP());
+
+ activated = true;
+
+ lastRASTime = currentTime;
+ openRowID = currentCommand->getAddress().getRow();
+ RASCount++;
+
+ // calculate when the next few commands can happen
+ nextActivateTime = max(nextActivateTime, currentTime + timing.tRC());
+ nextReadTime = max(nextReadTime, currentTime + timing.tRCD() - timing.tAL());
+ nextWriteTime = max(nextWriteTime, currentTime + timing.tRCD() - timing.tAL());
+ nextPrechargeTime = max(nextPrechargeTime, currentTime + timing.tRAS());
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief issue a precharge command to this bank
+//////////////////////////////////////////////////////////////////////////
+void Bank::issuePRE(const tick currentTime, const Command *currentCommand)
+{
+ switch (currentCommand->getCommandType())
+ {
+ case Command::READ_AND_PRECHARGE:
+ //lastPrechargeTime = max(currentTime + timing.tAL() + timing.tCAS() + timing.tBurst() + timing.tRTP(), lastRASTime + timing.tRAS());
+ // see figure 11.28 in Memory Systems: Cache, DRAM, Disk by Bruce Jacob, et al.
+ lastPrechargeTime = max(lastPrechargeTime, max(currentTime + (timing.tAL() - timing.tCCD() + timing.tBurst() + timing.tRTP()), lastRASTime + timing.tRAS()));
+ break;
+ case Command::WRITE_AND_PRECHARGE:
+ // see figure 11.29 in Memory Systems: Cache, DRAM, Disk by Bruce Jacob, et al.
+ // obeys minimum timing, but also supports tRAS lockout
+ lastPrechargeTime = max(lastPrechargeTime, max(currentTime + (timing.tAL() + timing.tCWD() + timing.tBurst() + timing.tWR()), lastRASTime + timing.tRAS()));
+ break;
+ case Command::PRECHARGE:
+ lastPrechargeTime = max(lastPrechargeTime, currentTime);
+ break;
+ default:
+ cerr << "Unhandled CAS variant" << endl;
+ break;
+ }
+
+ // make sure precharges follow activates
+ // technically, you can pre after pre, but there's no good reason for this
+ assert(activated == true);
+ activated = false;
+
+ // calculate when the next few commands can happen
+ nextActivateTime = max(nextActivateTime, lastPrechargeTime + timing.tRP());
+}
+
+//////////////////////////////////////////////////////////////////////////
+// @brief issue a CAS command to this bank
+//////////////////////////////////////////////////////////////////////////
+void Bank::issueCAS(const tick currentTime, const Command *currentCommand)
+{
+ //assert(activated);
+ assert(openRowID == currentCommand->getAddress().getRow());
+
+ //lastCASTime = currentTime + timing.tAL();
+ lastCASTime = currentTime;
+
+ lastCASLength = currentCommand->getLength();
+
+ CASCount++;
+
+ // calculate when the next few commands can happen
+ /// @todo which is correct?
+ //nextPrechargeTime = max(nextPrechargeTime, currentTime + timing.tAL() + timing.tBurst() + timing.tRTP() - timing.tCCD());
+ nextPrechargeTime = max(nextPrechargeTime, currentTime + timing.tAL() + timing.tCAS() + timing.tBurst() + max(0,timing.tRTP() - timing.tCMD()));
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief issue a CASW command to this bank
+//////////////////////////////////////////////////////////////////////////
+void Bank::issueCASW(const tick currentTime, const Command *currentCommand)
+{
+ //assert(activated);
+ assert(openRowID == currentCommand->getAddress().getRow());
+
+ //lastCASWTime = currentTime + timing.tAL();
+ lastCASWTime = currentTime;
+
+ lastCASWLength = currentCommand->getLength();
+
+ CASWCount++;
+
+ // calculate when the next few commands can happen
+ nextPrechargeTime = max(nextPrechargeTime, currentTime + timing.tAL() + timing.tCWD() + timing.tBurst() + timing.tWR());
+
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief issue a refresh command to this bank
+//////////////////////////////////////////////////////////////////////////
+void Bank::issueREF()
+{
+ assert(!activated);
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief returns the next time this command type may be issued
+//////////////////////////////////////////////////////////////////////////
+tick Bank::next(Command::CommandType nextCommandType) const
+{
+ switch (nextCommandType)
+ {
+ case Command::ACTIVATE:
+ return nextActivateTime;
+ break;
+ case Command::READ:
+ case Command::READ_AND_PRECHARGE:
+ return nextReadTime;
+ break;
+ case Command::WRITE:
+ case Command::WRITE_AND_PRECHARGE:
+ return nextWriteTime;
+ break;
+ case Command::PRECHARGE:
+ return nextPrechargeTime;
+ break;
+ case Command::REFRESH_ALL:
+ return 0;
+ break;
+ default:
+ return TICK_MAX;
+ break;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief reset statistics so that it appears the last command was not long ago
+/// @details choose recent times for the lastX actions so that values are not so
+/// large when looking to see when the next available time to execute any dependent
+/// command. Often issued just after fast-forwarding finishes in a simulator
+//////////////////////////////////////////////////////////////////////////
+void Bank::resetToTime(const tick time)
+{
+ lastRASTime = time - timing.tRC();
+ lastPrechargeTime = time - timing.tRP();
+ lastCASTime = time - timing.tCAS() - timing.tBurst();
+ lastCASWTime = time - timing.tCWD() - timing.tWTR() - timing.tBurst();
+
+ nextPrechargeTime = lastCASWTime + timing.tAL() + timing.tCWD() + timing.tBurst() + timing.tWR();
+ nextPrechargeTime = max(nextPrechargeTime,lastCASTime + timing.tAL() + timing.tCAS() + timing.tBurst() + max(0,timing.tRTP() - timing.tCMD()));
+ nextActivateTime = lastPrechargeTime + timing.tRP();
+
+ nextActivateTime = max(nextActivateTime, lastRASTime + timing.tRC());
+ nextReadTime = lastRASTime + timing.tRCD() - timing.tAL();
+ nextWriteTime = lastRASTime + timing.tRCD() - timing.tAL();
+ nextPrechargeTime = max(nextPrechargeTime, lastRASTime + timing.tRAS());
+}
+
+
+//////////////////////////////////////////////////////////////////////
+/// @brief check to see if this transaction can be inserted successfully via the open page aggressive insert mechanism
+/// @details goes through the per bank queue to see that there is a slot to insert into and that
+/// there is a precharge command to the same row that it can insert before
+/// also looks for CAS, Pre commands that can be compressed in order to fit this
+/// @author Joe Gross
+/// @param incomingTransaction the transaction to test
+/// @param time the current time, used to check and prevent against starvation of commands
+/// @return true if it is able to be inserted, false otherwise
+//////////////////////////////////////////////////////////////////////
+bool Bank::openPageAggressiveInsertCheck(const Transaction *incomingTransaction, const tick time) const
+{
+ if (perBankQueue.freecount() >= 3)
+ {
+ return true;
+ }
+ else
+ {
+ unsigned availableSlots = perBankQueue.freecount();
+
+ // if the queue ends with a R/W(+P), then all that is needed is A, R/W
+ if (perBankQueue.back()->isReadOrWrite())
+ {
+ if (availableSlots >= 2)
+ return true;
+ }
+
+ for (unsigned i = 0; i < perBankQueue.size() - 1; i++)
+ {
+ if (perBankQueue[i]->isReadOrWrite() && perBankQueue[i+1] && perBankQueue[i+1]->isBasicPrecharge())
+ {
+ availableSlots++;
+ if (availableSlots >= 3)
+ return true;
+ }
+ }
+
+ if (availableSlots == 0)
+ return false;
+
+ const unsigned currentRow = incomingTransaction->getAddress().getRow();
+
+ // look in the bank_q and see if there's a precharge for this row to insert before
+ // go from tail to head
+ for (int currentIndex = perBankQueue.size() - 1; currentIndex >= 0; --currentIndex)
+ {
+ const Command *currentCommand = perBankQueue.read(currentIndex);
+
+ // channel, rank, bank, row all match, insert just before this precharge command
+ if (currentCommand->isReadOrWrite() && (currentCommand->getAddress().getRow() == currentRow))
+ {
+ assert(currentCommand->getAddress().getChannel() == incomingTransaction->getAddress().getChannel());
+ assert(currentCommand->getAddress().getRank() == incomingTransaction->getAddress().getRank());
+ assert(currentCommand->getAddress().getBank() == incomingTransaction->getAddress().getBank());
+ assert(currentCommand->getAddress().getRow() == incomingTransaction->getAddress().getRow());
+
+ return true;
+ }
+ // strict order may add to the end of the queue only
+ // if this has not happened already then this method of insertion fails
+ else if (systemConfig.getCommandOrderingAlgorithm() == STRICT_ORDER)
+ {
+ return false;
+ }
+ // then this command has been delayed by too many times and no more
+ // commands can preempt it
+ else if (time - currentCommand->getEnqueueTime() > systemConfig.getSeniorityAgeLimit())
+ {
+ return false;
+ }
+ }
+ // if the correct row is already open, just insert there
+ // already guaranteed not to have RAW/WAR errors
+ if (activated && openRowID == currentRow)
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief reduce discrete CAS and Precharge commands to CAS+P to free up space
+//////////////////////////////////////////////////////////////////////////
+void Bank::collapse()
+{
+ for (unsigned i = 0; i < perBankQueue.size() - 1; i++)
+ {
+ if (perBankQueue[i]->isReadOrWrite() && perBankQueue[i+1] && perBankQueue[i+1]->isBasicPrecharge())
+ {
+ if (perBankQueue[i]->getAddress().getBank() != perBankQueue[i+1]->getAddress().getBank())
+ assert(false);
+ assert(!perBankQueue[i]->isPrecharge());
+ perBankQueue[i]->setAutoPrecharge(true);
+ Command *toDelete = perBankQueue.remove(i+1);
+ assert(!toDelete->isReadOrWrite() && toDelete->isBasicPrecharge());
+ assert(!toDelete->getHost());
+ //cerr << *toDelete << endl;
+ delete toDelete;
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief see if there is room to insert a command using the Close Page Aggressive algorithm and then insert
+/// @param incomingTransaction the transaction to insert
+/// @param time the current time, used to check and prevent against starvation of commands
+/// @author Joe Gross
+//////////////////////////////////////////////////////////////////////////
+bool Bank::aggressiveInsert(Transaction *incomingTransaction, const tick time)
+{
+ if (!perBankQueue.isFull())
+ {
+ const unsigned currentRow = incomingTransaction->getAddress().getRow();
+
+ // go from the end to the beginning to ensure no starvation or RAW/WAR errors
+ for (int currentIndex = perBankQueue.size() - 1; currentIndex >= 0; --currentIndex)
+ {
+ const Command *currentCommand = perBankQueue.read(currentIndex);
+
+ // see if there is an available command to piggyback on
+ if (currentCommand->isReadOrWrite() && currentCommand->getAddress().getRow() == currentRow)
+ {
+ bool needsPrecharge = currentCommand->isPrecharge();
+
+ if (needsPrecharge)
+ {
+ currentCommand->setAutoPrecharge(false);
+ }
+
+ // if the precharge was stripped from the n-1 command, add it to this one
+#ifndef NDEBUG
+ bool result =
+#endif
+ perBankQueue.insert(new Command(incomingTransaction, time, needsPrecharge, timing.tBurst()), currentIndex + 1);
+ assert(perBankQueue[currentIndex + 1]->getAddress() == incomingTransaction->getAddress());
+ assert(result);
+ return true;
+ }
+ // strict order may add to the end of the queue only
+ // if this has not happened already then this method of insertion fails
+ else if (systemConfig.getCommandOrderingAlgorithm() == STRICT_ORDER)
+ {
+ return false;
+ }
+ else if (time - currentCommand->getEnqueueTime() > systemConfig.getSeniorityAgeLimit())
+ {
+ return false;
+ }
+ }
+
+ // if the correct row is already open, just insert there
+ // already guaranteed not to have RAW/WAR errors
+ if (activated && openRowID == currentRow)
+ {
+#ifndef NDEBUG
+ bool result =
+#endif
+ perBankQueue.push_front(new Command(incomingTransaction, time, false, timing.tBurst()));
+ assert(result);
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief see if there is room to insert a command using the Close Page Aggressive algorithm
+/// @param incomingTransaction the transaction to insert
+/// @param time the current time, used to check and prevent against starvation of commands
+/// @author Joe Gross
+//////////////////////////////////////////////////////////////////////////
+bool Bank::closePageAggressiveInsertCheck(const Transaction *incomingTransaction, const tick time) const
+{
+ if (!perBankQueue.isFull())
+ {
+ const unsigned currentRow = incomingTransaction->getAddress().getRow();
+ // go from the end to the beginning to ensure no starvation or RAW/WAR errors
+ for (int currentIndex = perBankQueue.size() - 1; currentIndex >= 0; --currentIndex)
+ {
+ const Command *currentCommand = perBankQueue[currentIndex];
+ // see if there is an available command to piggyback on
+ if (currentCommand->isReadOrWrite() && currentCommand->getAddress().getRow() == currentRow)
+ {
+ assert(currentCommand->getAddress().getChannel() == incomingTransaction->getAddress().getChannel());
+ assert(currentCommand->getAddress().getRank() == incomingTransaction->getAddress().getRank());
+ assert(currentCommand->getAddress().getBank() == incomingTransaction->getAddress().getBank());
+ assert(currentCommand->getAddress().getRow() == incomingTransaction->getAddress().getRow());
+
+ if (!systemConfig.isAutoPrecharge())
+ {
+ // check that things are in order
+ assert(perBankQueue[currentIndex + 1]->isPrecharge());
+ }
+ return true;
+ }
+ else if (systemConfig.getCommandOrderingAlgorithm() == STRICT_ORDER)
+ {
+ return false;
+ }
+ // don't starve commands
+ else if (time - currentCommand->getEnqueueTime() > systemConfig.getSeniorityAgeLimit())
+ {
+ return false;
+ }
+ }
+ if (activated && openRowID == currentRow)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool Bank::isEmpty() const
+{
+ return perBankQueue.isEmpty();
+}
+
+bool Bank::hasNoReadWrite() const
+{
+ for (unsigned i = 0; i < perBankQueue.size(); i++)
+ {
+ if (!perBankQueue[i]->isRefresh())
+ return false;
+ }
+ return true;
+
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief assignment operator to copy non-reference values
+/// @param rhs the incomingTransaction that will be copied into this object
+//////////////////////////////////////////////////////////////////////////
+Bank& Bank::operator =(const Bank& rhs)
+{
+ perBankQueue = rhs.perBankQueue;
+ lastRASTime = rhs.lastRASTime;
+ lastCASTime = rhs.lastCASTime;
+ lastCASWTime = rhs.lastCASWTime;
+ lastPrechargeTime = rhs.lastPrechargeTime;
+ lastCASLength = rhs.lastCASLength;
+ lastCASWLength = rhs.lastCASWLength;
+ openRowID = rhs.openRowID;
+ activated = rhs.activated;
+ RASCount = rhs.RASCount;
+ totalRASCount = rhs.totalRASCount;
+ CASCount = rhs.CASCount;
+ totalCASCount = rhs.totalCASCount;
+ CASWCount = rhs.CASWCount;
+ totalCASWCount = rhs.totalCASWCount;
+ nextPrechargeTime = rhs.nextPrechargeTime;
+ nextWriteTime = rhs.nextWriteTime;
+ nextReadTime = rhs.nextReadTime;
+ nextActivateTime = rhs.nextActivateTime;
+
+ return *this;
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief equality operator to check values for equality
+/// @param rhs the incomingTransaction that will be copied into this object
+//////////////////////////////////////////////////////////////////////////
+bool Bank::operator==(const Bank& rhs) const
+{
+ return (timing == rhs.timing && systemConfig == rhs.systemConfig && perBankQueue == rhs.perBankQueue && lastRASTime == rhs.lastRASTime &&
+ lastCASTime == rhs.lastCASTime && lastCASWTime == rhs.lastCASWTime && lastPrechargeTime == rhs.lastPrechargeTime &&
+ lastCASLength == rhs.lastCASLength && lastCASWLength == rhs.lastCASWLength &&
+ openRowID == rhs.openRowID && activated == rhs.activated && RASCount == rhs.RASCount && totalRASCount == rhs.totalRASCount &&
+ CASCount == rhs.CASCount && totalCASCount == rhs.totalCASCount && CASWCount == rhs.CASWCount && totalCASWCount == rhs.totalCASWCount);
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// @brief insertion operator to serialize the object in summary
+//////////////////////////////////////////////////////////////////////////
+std::ostream& DRAMsimII::operator<<(std::ostream& os, const Bank& pc)
+{
+ return os << "PBQ" << endl << pc.perBankQueue << "last RAS [" << pc.lastRASTime << "] act[" <<
+ pc.activated << "] open row[" << pc.openRowID << "]" << endl;
+}
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/src/Channel.hh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/src/Channel.hh Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,142 @@
+// Copyright (C) 2010 University of Maryland.
+// This file is part of DRAMsimII.
+//
+// DRAMsimII is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// DRAMsimII is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with DRAMsimII. If not, see .
+
+#ifndef CHANNEL_HH
+#define CHANNEL_HH
+#pragma once
+
+#include "globals.hh"
+#include "Rank.hh"
+#include "powerConfig.hh"
+#include "TimingSpecification.hh"
+#include "SystemConfiguration.hh"
+#include "Statistics.hh"
+#include "queue.hh"
+#include "powerConfig.hh"
+#include "transaction.hh"
+#include "command.hh"
+
+#include
+#include
+
+namespace DRAMsimII
+{
+ /// @brief represents a DRAM channel, has individual timing parameters, ranks, banks, clock, etc.
+ class Channel
+ {
+ // members
+ protected:
+
+ tick time; ///< channel time, allow for channel concurrency
+ tick lastCommandIssueTime; ///< the last time a command was executed on this channel
+ const Command *lastCommand; ///< id of the last accessed rank of this channel
+ TimingSpecification timingSpecification; ///< the timing specs for this channel
+ Queue transactionQueue; ///< transaction queue for the channel
+ std::vector refreshCounter; ///< holds the next refresh command time for the rank
+ const SystemConfiguration &systemConfig; ///< a pointer to common system config values
+ Statistics &statistics; ///< backward pointer to the stats engine
+ PowerConfig powerModel; ///< the power model for this channel, retains power stats
+ unsigned channelID; ///< the ordinal value of this channel (0..n)
+ std::vector rank; ///< vector of the array of ranks
+ std::queue > finishedTransactions; ///< the transactions finished this time
+ std::vector,std::pair > > cprhSequence; ///< the sequence that the command pair rank hopping follows
+ unsigned lastCprhLocation; ///< index of the last location where a cprh command was chosen from
+
+ // functions
+ void retireCommand(Command *, const bool isHit);
+ bool checkForAvailableCommandSlots(const Transaction *trans) const;
+ bool transaction2commands(Transaction *);
+ Command *getNextCommand(const Command *useThisCommand = NULL);
+
+ std::pair getNextCPRHValues(const unsigned) const;
+ void setupCprhValues();
+ void setLastCprhLocation(unsigned rank, unsigned bank, bool isActivate);
+
+ Transaction *getTransaction();
+ Transaction *getAvailableTransaction(unsigned useThis = UINT_MAX);
+
+ const Transaction *readTransaction(bool) const;
+ unsigned readAvailableTransaction(bool) const;
+
+ Transaction *createNextRefresh();
+ const Transaction *readNextRefresh() const;
+
+ tick nextRefreshTime() const;
+ tick nextTransactionDecodeTime() const;
+ tick nextCommandExecuteTime() const;
+ void executeCommand(Command *thisCommand);
+ bool canIssue(const Command *thisCommand) const { return earliestExecuteTime(thisCommand) <= time; }
+
+ // functions that may differ for architectures that inherit this
+ virtual const Command *readNextCommand() const;
+ virtual tick minProtocolGap(const Command *thisCommand) const;
+ virtual tick earliestExecuteTime(const Command *thisCommand) const;
+ virtual tick earliestExecuteTimeLog(const Command *thisCommand) const;
+
+ public:
+ // constructors
+ explicit Channel(const Settings& settings, const SystemConfiguration& sysConfig, Statistics& stats);
+ Channel(const Channel&);
+ explicit Channel(const Channel& rhs, const SystemConfiguration& systemConfig, Statistics& stats);
+ virtual ~Channel();
+
+ // functions
+ bool enqueue(Transaction *in);
+ bool isFull() const { return transactionQueue.isFull(); } ///< determines whether there is room for more transactions
+ unsigned getChannelID() const { return channelID; } ///< return the ordinal of this channel
+ std::ostream &doPowerCalculation(std::ostream &os);
+ virtual tick nextTick() const;
+ void resetToTime(const tick time);
+ std::queue >::size_type pendingTransactionCount() const { return finishedTransactions.size(); }
+ void getPendingTransactions(std::queue > &);
+ void resetStats();
+
+ virtual void moveToTime(const tick currentTime);
+
+ // accessors
+ const TimingSpecification& getTimingSpecification() const { return timingSpecification; } ///< returns a reference to access the timing specification
+ Rank& getRank(const unsigned rankNum) { return rank[rankNum]; } ///< get a reference to this channel's rank n
+ const Rank& getRank(const unsigned rankNum) const { return rank[rankNum]; } ///< get a const reference to this channel's rank n
+ std::vector& getRank() { return rank; } ///< get a reference to this channel's ranks
+ const std::vector& getRank() const { return rank; } ///< get a const reference to this channel's ranks
+ tick getTime() const { return time; } ///< get the time that this channel is at
+ unsigned getLastRankID() const { return lastCommand ? lastCommand->getAddress().getRank() : systemConfig.getRankCount() - 1; }///< get the last rank id a command was issued to
+ bool isEmpty() const;
+
+
+ unsigned getTransactionQueueCount() const { return transactionQueue.size(); } ///< determine how many items are in the transaction completion queue
+ unsigned getTransactionQueueDepth() const { return transactionQueue.depth(); } ///< determine how large the transaction completion queue is
+ Rank& operator[](unsigned rank_num) { return rank[rank_num]; }
+
+ // mutators
+ void setTime(tick value) { time = value; } ///< update the time for this channel
+ void setChannelID(const unsigned value);
+ Transaction::TransactionType setReadWriteType(const int) const;
+
+ // overloads
+ Channel& operator =(const Channel& rs);
+ bool operator==(const Channel& right) const;
+ friend std::ostream& operator<<(std::ostream& , const Channel&);
+
+ private:
+ bool sendPower(double PsysRD, double PsysWR, std::vector rankArray, std::vector PsysACTSTBYArray, std::vector PsysACTArray, const tick currentTime) const;
+
+ // serialization
+ explicit Channel(const Settings& settings, const SystemConfiguration& sysConf, Statistics& stats, const PowerConfig& power,const std::vector& rank, const TimingSpecification& timing);
+ explicit Channel();
+ };
+}
+#endif
diff -r 634d88f0dbd4 -r 846e12a6426c src/mem/dramsimii-m5/src/Channel.cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mem/dramsimii-m5/src/Channel.cc Wed Nov 17 18:41:58 2010 -0500
@@ -0,0 +1,3447 @@
+// Copyright (C) 2010 University of Maryland.
+// This file is part of DRAMsimII.
+//
+// DRAMsimII is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// DRAMsimII is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with DRAMsimII. If not, see .
+
+#include
+#include
+#include
+#include
+#include