| // Copyright (c) 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: Gabe Black | |
| def template MicroRomConstructor {{ | |
| %(define_generators)s | |
| const MicroPC X86ISA::MicrocodeRom::numMicroops = %(num_microops)s; | |
| X86ISA::MicrocodeRom::MicrocodeRom() | |
| { | |
| using namespace RomLabels; | |
| genFuncs = new GenFunc[numMicroops]; | |
| %(alloc_generators)s; | |
| } | |
| }}; | |
| let {{ | |
| from micro_asm import Rom | |
| class X86MicrocodeRom(Rom): | |
| def __init__(self, name): | |
| super(X86MicrocodeRom, self).__init__(name) | |
| self.directives = {} | |
| def add_microop(self, mnemonic, microop): | |
| microop.mnemonic = mnemonic | |
| microop.micropc = len(self.microops) | |
| self.microops.append(microop) | |
| def getDeclaration(self): | |
| declareLabels = "namespace RomLabels {\n" | |
| for (label, microop) in self.labels.items(): | |
| declareLabels += "const static uint64_t label_%s = %d;\n" \ | |
| % (label, microop.micropc) | |
| for (label, microop) in self.externs.items(): | |
| declareLabels += \ | |
| "const static MicroPC extern_label_%s = %d;\n" \ | |
| % (label, microop.micropc) | |
| declareLabels += "}\n" | |
| return declareLabels; | |
| def getDefinition(self): | |
| numMicroops = len(self.microops) | |
| allocGenerators = '' | |
| micropc = 0 | |
| define_generators = ''' | |
| namespace | |
| { | |
| static const char romMnemonic[] = "Microcode_ROM"; | |
| ''' | |
| for op in self.microops: | |
| define_generators += op.getGeneratorDef(micropc) | |
| allocGenerators += "genFuncs[%d] = %s;\n" % \ | |
| (micropc, op.getGenerator(micropc)) | |
| micropc += 1 | |
| define_generators += "}\n" | |
| iop = InstObjParams(self.name, self.name, "MicrocodeRom", | |
| {"code" : "", | |
| "define_generators" : define_generators, | |
| "num_microops" : numMicroops, | |
| "alloc_generators" : allocGenerators | |
| }) | |
| return MicroRomConstructor.subst(iop); | |
| }}; |