# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause """ Generic document construction classes. These classes are templates for creating documents that are not bound to a specific usage or data model. Copyright (C) 2022 Intel Corporation Author: Lee, Kah Jing """ class document(object): """ An abstract document class which does not dictate how a document should be constructed or manipulated. It's sole purpose is to describe the entire document in smaller units """ class entry(object): """ An entry is the smallest unit """ def __init__(self, parent): """ entry initialization """ if parent != None: parent.add(self) class block(entry): """ A block is the smallest collection unit consists of entries and blocks. """ def __init__(self, parent): """ block initialization """ super(document.block, self).__init__(parent) self.entries = [] def add(self, entry): """ add entry to block """ self.entries.append(entry) def __init__(self): """ document initialization """ self.entries = [] def add(self, entry): """ add entry to entry list """ self.entries.append(entry) class text(document): """ A simple text document implementation """ class string(document.entry): """ The smallest unit of a text file is a string """ def __init__(self, parent, stringString=None): """ string initialization """ super(text.string, self).__init__(parent) self.stringString = stringString def __str__(self): """ convert None to empty string """ if (self.stringString != None): return self.stringString else: return "" class line(string): """ A line is a string with EOL character """ def __str__(self): """ convert string with newline """ return super(text.line, self).__str__() + "\n" class block(document.block): """ A block of text which can be made up of strings or lines """ def __str__(self): """ concatenate strings or lines """ blockString = "" for entry in self.entries: blockString += str(entry) return blockString def __str__(self): """ concatenate strings or lines """ textString = "" for entry in self.entries: textString += str(entry) return textString class c_source(text): """ A simple C header document implementation """ class define(text.string): """ C header define """ def __init__(self, parent, id, token=None): """ c header constructor initialization """ super(c_source.define, self).__init__(parent, id) self.token = token def __str__(self): """ c header to strings """ defineString = "#define" + " " + super(c_source.define, self).__str__() if self.token != None: defineString += " " + self.token defineString += "\n" return defineString class comment_string(text.string): """ C header comment """ def __str__(self): """ c comment """ return "/*" + " " + super(c_source.comment_string, self).__str__() + " " + "*/" class comment_line(comment_string): """ C header comment with newline """ def __str__(self): """ c comment with newline """ return super(c_source.comment_line, self).__str__() + "\n" class block(text.block): """ A simple C block string implementation """ def __init__(self, parent, prologue=None, epilogue=None): """ ifdef block string implementation """ super(c_source.block, self).__init__(parent) self.prologue = None self.epilogue = None if prologue != None: self.prologue = prologue if epilogue != None: self.epilogue = epilogue def __str__(self): """ convert ifdef to string """ blockString = "" if self.prologue != None: blockString += str(self.prologue) blockString += super(c_source.block, self).__str__() if self.epilogue != None: blockString += str(self.epilogue) return blockString class comment_block(block): """ A simple C header block comment implementation """ def __init__(self, parent, comments): """ block comment initialization """ super(c_source.comment_block, self).__init__(parent, "/*\n", " */\n") for comment in comments.split("\n"): self.add(comment) def add(self, entry): """ add line to block comment """ super(c_source.block, self).add(" * " + entry + "\n") class ifndef_block(block): """ A simple C header ifndef implementation """ def __init__(self, parent, id): """ ifndef block initialization """ prologue = text.line(None, "#ifndef" + " " + id) epilogue = text.block(None) text.string(epilogue, "#endif") text.string(epilogue, " ") c_source.comment_line(epilogue, id) super(c_source.ifndef_block, self).__init__(parent, prologue, epilogue) class generated_c_source(c_source): """ Caller to generate c format files using the helper classes """ def __init__(self, filename): """ Generate c header file with license, copyright, comment, ifdef block """ super(generated_c_source, self).__init__() self.entries.append(c_source.comment_line(None, "SPDX-License-Identifier: BSD-3-Clause")) self.entries.append(c_source.comment_block(None, "Copyright (C) 2022 Intel Corporation ")) self.entries.append(c_source.comment_block(None, "Altera SoCFPGA Clock and PLL configuration")) self.entries.append(text.line(None)) self.body = c_source.ifndef_block(None, filename) self.body.add(c_source.define(None, filename)) self.entries.append(self.body) def add(self, entry): """ add content to be written into c header file """ self.body.add(entry)