1// Copyright (c) 2008 The Regents of The University of Michigan 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer; 8// redistributions in binary form must reproduce the above copyright 9// notice, this list of conditions and the following disclaimer in the 10// documentation and/or other materials provided with the distribution; 11// neither the name of the copyright holders nor the names of its 12// contributors may be used to endorse or promote products derived from 13// this software without specific prior written permission. 14// 15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26// 27// Authors: Gabe Black 28 29def template MicroRomConstructor {{ 30 31 %(define_generators)s 32 const MicroPC X86ISA::MicrocodeRom::numMicroops = %(num_microops)s; 33 34 X86ISA::MicrocodeRom::MicrocodeRom() 35 { 36 using namespace RomLabels; 37 genFuncs = new GenFunc[numMicroops]; 38 %(alloc_generators)s; 39 } 40}}; 41 42let {{ 43 from micro_asm import Rom 44 45 class X86MicrocodeRom(Rom): 46 def __init__(self, name): 47 super(X86MicrocodeRom, self).__init__(name) 48 self.directives = {} 49 50 def add_microop(self, mnemonic, microop): 51 microop.mnemonic = mnemonic 52 microop.micropc = len(self.microops) 53 self.microops.append(microop) 54 55 56 def getDeclaration(self): 57 declareLabels = "namespace RomLabels {\n" 58 for (label, microop) in self.labels.items(): 59 declareLabels += "const static uint64_t label_%s = %d;\n" \ 60 % (label, microop.micropc) 61 for (label, microop) in self.externs.items(): 62 declareLabels += \ 63 "const static MicroPC extern_label_%s = %d;\n" \ 64 % (label, microop.micropc) 65 declareLabels += "}\n" 66 return declareLabels; 67 68 def getDefinition(self): 69 numMicroops = len(self.microops) 70 allocGenerators = '' 71 micropc = 0 72 define_generators = ''' 73 namespace 74 { 75 static const char romMnemonic[] = "Microcode_ROM"; 76 ''' 77 for op in self.microops: 78 define_generators += op.getGeneratorDef(micropc) 79 allocGenerators += "genFuncs[%d] = %s;\n" % \ 80 (micropc, op.getGenerator(micropc)) 81 micropc += 1 82 define_generators += "}\n" 83 iop = InstObjParams(self.name, self.name, "MicrocodeRom", 84 {"code" : "", 85 "define_generators" : define_generators, 86 "num_microops" : numMicroops, 87 "alloc_generators" : allocGenerators 88 }) 89 return MicroRomConstructor.subst(iop); 90}}; 91