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.externs.items(): 59 declareLabels += \ 60 "const static MicroPC extern_label_%s = %d;\n" \ 61 % (label, microop.micropc) 62 declareLabels += "}\n" 63 return declareLabels; 64 65 def getDefinition(self): 66 numMicroops = len(self.microops) 67 allocGenerators = '' 68 micropc = 0 69 define_generators = ''' 70 namespace 71 { 72 static const char romMnemonic[] = "Microcode_ROM"; 73 ''' 74 for op in self.microops: 75 define_generators += op.getGeneratorDef(micropc) 76 allocGenerators += "genFuncs[%d] = %s;\n" % \ 77 (micropc, op.getGenerator(micropc)) 78 micropc += 1 79 define_generators += "}\n" 80 iop = InstObjParams(self.name, self.name, "MicrocodeRom", 81 {"code" : "", 82 "define_generators" : define_generators, 83 "num_microops" : numMicroops, 84 "alloc_generators" : allocGenerators 85 }) 86 return MicroRomConstructor.subst(iop); 87}}; |