From bfcce272c96b8b3e5b58f8df762a81730a09cd25 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 13 Oct 2024 18:38:13 +0200 Subject: [PATCH] =?UTF-8?q?mise=20=C3=A0=20jour=20tp4b?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TP04/tp4b.pdf | Bin 0 -> 108771 bytes docs/html/_modules/Lib/Allocator.html | 2 + docs/html/_modules/Lib/CFG.html | 403 ++++++++++++++++++ docs/html/_modules/Lib/Errors.html | 2 + docs/html/_modules/Lib/FunctionData.html | 2 + docs/html/_modules/Lib/LinearCode.html | 2 + docs/html/_modules/Lib/Operands.html | 2 + docs/html/_modules/Lib/RiscV.html | 2 + docs/html/_modules/Lib/Statement.html | 2 + docs/html/_modules/Lib/Terminator.html | 261 ++++++++++++ docs/html/_modules/index.html | 4 + docs/html/_sources/api/Lib.CFG.rst.txt | 7 + docs/html/_sources/api/Lib.Terminator.rst.txt | 7 + docs/html/_sources/api/Lib.rst.txt | 2 + docs/html/api/Lib.Allocator.html | 4 + docs/html/api/Lib.CFG.html | 372 ++++++++++++++++ docs/html/api/Lib.Errors.html | 2 + docs/html/api/Lib.FunctionData.html | 2 + docs/html/api/Lib.LinearCode.html | 2 + docs/html/api/Lib.Operands.html | 2 + docs/html/api/Lib.RiscV.html | 2 + docs/html/api/Lib.Statement.html | 2 + docs/html/api/Lib.Terminator.html | 287 +++++++++++++ docs/html/api/Lib.html | 69 +++ docs/html/api/modules.html | 14 + docs/html/genindex.html | 179 +++++++- docs/html/index.html | 73 +++- docs/html/objects.inv | Bin 1281 -> 1631 bytes docs/html/py-modindex.html | 12 + docs/html/search.html | 2 + docs/html/searchindex.js | 2 +- 31 files changed, 1710 insertions(+), 14 deletions(-) create mode 100644 TP04/tp4b.pdf create mode 100644 docs/html/_modules/Lib/CFG.html create mode 100644 docs/html/_modules/Lib/Terminator.html create mode 100644 docs/html/_sources/api/Lib.CFG.rst.txt create mode 100644 docs/html/_sources/api/Lib.Terminator.rst.txt create mode 100644 docs/html/api/Lib.CFG.html create mode 100644 docs/html/api/Lib.Terminator.html diff --git a/TP04/tp4b.pdf b/TP04/tp4b.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf6de3f1a0caafca3e5d608b2fd02f95de6d5f7c GIT binary patch literal 108771 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
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/_modules/Lib/CFG.html b/docs/html/_modules/Lib/CFG.html new file mode 100644 index 0000000..c9a0886 --- /dev/null +++ b/docs/html/_modules/Lib/CFG.html @@ -0,0 +1,403 @@ + + + + + + Lib.CFG — MiniC documentation + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +

    Source code for Lib.CFG

    +"""
    +Classes for a RiscV CFG: :py:class:`CFG` for the CFG itself,
    +and :py:class:`Block` for its basic blocks.
    +"""
    +
    +from graphviz import Digraph  # for dot output
    +from typing import cast, Any, Dict, List, Set, Iterator
    +
    +from Lib.Errors import MiniCInternalError
    +from Lib.Operands import (Operand, Immediate, Function, A0)
    +from Lib.Statement import (
    +    Statement, Instru3A, Label,
    +    AbsoluteJump, ConditionalJump, Comment
    +)
    +from Lib.Terminator import (
    +    Terminator, BranchingTerminator, Return)
    +from Lib.FunctionData import (FunctionData, _iter_statements, _print_code)
    +
    +
    +BlockInstr = Instru3A | Comment
    +
    +
    +
    [docs]class Block: + """ + A basic block of a :py:class:`CFG` is made of three main parts: + + - a start :py:class:`label <Lib.Statement.Label>` that uniquely identifies the block in the CFG + - the main body of the block, a list of instructions + (excluding labels, jumps and branching instructions) + - a :py:class:`terminator <Lib.Terminator.Terminator>` + that represents the final jump or branching instruction of the block, + and points to the successors of the block. + See the documentation for :py:class:`Lib.Terminator.Terminator` for further explanations. + """ + + _terminator: Terminator + _label: Label + _phis: List[Statement] + _instructions: List[BlockInstr] + _in: List['Block'] + _gen: Set + _kill: Set + + def __init__(self, label: Label, insts: List[BlockInstr], terminator: Terminator): + self._label = label + self._instructions = insts + self._in = [] + self._phis = [] + self._terminator = terminator + self._gen = set() + self._kill = set() + + def __str__(self): + instr = [i for i in self._instructions if not isinstance(i, Comment)] + instr_str = '\n'.join(map(str, instr)) + s = '{}:\n\n{}'.format(self._label, instr_str) + return s + +
    [docs] def to_dot(self) -> str: # pragma: no cover + """Outputs all statements of the block as a string.""" + # dot is weird: lines ending with \l instead of \n are left-aligned. + NEWLINE = '\\l ' + instr = [] + instr += self._phis + instr += [i for i in self._instructions if not isinstance(i, Comment)] + instr += [self.get_terminator()] + instr_str = NEWLINE.join(map(str, instr)) + s = '{}:{}{}\\l'.format(self._label, NEWLINE, instr_str) + return s
    + + def __repr__(self): + return str(self._label) + +
    [docs] def get_body(self) -> List[BlockInstr]: + """Return the statements in the body of the block (no phi-node nor the terminator).""" + return self._instructions
    + +
    [docs] def get_all_statements(self) -> List[Statement]: + """ + Return all statements of the block + (including phi-nodes and the terminator, but not the label of the block). + """ + return (self._phis + + cast(List[Statement], self._instructions) + + [self.get_terminator()])
    + +
    [docs] def get_body_and_terminator(self) -> List[Statement]: + """ + Return all statements of the block, except phi-nodes + (and the label of the block). + """ + return (cast(List[Statement], self._instructions) + + [self.get_terminator()])
    + +
    [docs] def get_label(self) -> Label: + """Return the label of the block.""" + return self._label
    + +
    [docs] def get_in(self) -> List['Block']: + """Return the list of blocks with an edge to the considered block.""" + return self._in
    + +
    [docs] def get_terminator(self) -> Terminator: + """Return the terminator of the block.""" + return self._terminator
    + +
    [docs] def set_terminator(self, term: Terminator) -> None: + """Set the terminator of the block.""" + self._terminator = term
    + +
    [docs] def get_phis(self) -> List[Statement]: + """Return the list of all φ instructions of the block.""" + return self._phis
    + +
    [docs] def add_phi(self, phi: Statement) -> None: + """Add a φ instruction to the block.""" + self._phis.append(phi)
    + +
    [docs] def set_phis(self, phis: List[Statement]) -> None: + """Replace the φ instructions in the block by the given list `phis`.""" + self._phis = phis
    + +
    [docs] def remove_all_phis(self) -> None: + """Remove all φ instructions in the block.""" + self._phis = []
    + +
    [docs] def iter_statements(self, f) -> None: + """Iterate over instructions. + For each real instruction i (not label or comment), replace it + with the list of instructions given by f(i). + + Assume there is no phi-node. + """ + assert (self._phis == []) + new_statements = _iter_statements(self._instructions, f) + end_statements = f(self.get_terminator()) + if len(end_statements) >= 1 and isinstance(end_statements[-1], Terminator): + new_terminator = end_statements.pop(-1) + self._instructions = new_statements + end_statements + self.set_terminator(new_terminator) + else: + raise MiniCInternalError( + "Block.iter_statements: Invalid replacement for terminator {}:\n {}" + .format(self.get_terminator(), end_statements))
    + +
    [docs] def add_instruction(self, instr: BlockInstr) -> None: + """Add an instruction to the body of the block.""" + self._instructions.append(instr)
    + + +
    [docs]class CFG: + """ + A complete control-flow graph representing a function. + This class is mainly made of a list of basic :py:class:`Block`, + a label indicating the :py:meth:`entry point of the function <get_start>`, + and an :py:meth:`exit label <get_end>`. + + As with linear code, metadata about the function can be found + in the :py:attr:`fdata` member variable. + """ + + _start: Label + _end: Label + _blocks: Dict[Label, Block] + + #: Metadata about the function represented by this CFG + fdata: FunctionData + + def __init__(self, fdata: FunctionData): + self._blocks = {} + self.fdata = fdata + self._init_blks() + self._end = self.fdata.fresh_label("end") + + def _init_blks(self) -> None: + """Add a block for division by 0.""" + # Label for the address of the error message + # This address is added by print_code + label_div_by_zero_msg = Label(self.fdata._label_div_by_zero.name + "_msg") + blk = Block(self.fdata._label_div_by_zero, [ + Instru3A("la", A0, label_div_by_zero_msg), + Instru3A("call", Function("println_string")), + Instru3A("li", A0, Immediate(1)), + Instru3A("call", Function("exit")), + ], terminator=Return()) + self.add_block(blk) + +
    [docs] def get_start(self) -> Label: + """Return the entry label of the CFG.""" + return self._start
    + +
    [docs] def set_start(self, start: Label) -> None: + """Set the entry label of the CFG.""" + assert (start in self._blocks) + self._start = start
    + +
    [docs] def get_end(self) -> Label: + """Return the exit label of the CFG.""" + return self._end
    + +
    [docs] def add_block(self, blk: Block) -> None: + """Add a new block to the CFG.""" + self._blocks[blk._label] = blk
    + +
    [docs] def get_block(self, name: Label) -> Block: + """Return the block with label `name`.""" + return self._blocks[name]
    + +
    [docs] def get_blocks(self) -> List[Block]: + """Return all the blocks.""" + return [b for b in self._blocks.values()]
    + +
    [docs] def get_entries(self) -> List[Block]: + """Return all the blocks with no predecessors.""" + return [b for b in self._blocks.values() if not b.get_in()]
    + +
    [docs] def add_edge(self, src: Block, dest: Block) -> None: + """Add the edge src -> dest in the control flow graph.""" + dest.get_in().append(src)
    + # assert (dest.get_label() in src.get_terminator().targets()) + +
    [docs] def remove_edge(self, src: Block, dest: Block) -> None: + """Remove the edge src -> dest in the control flow graph.""" + dest.get_in().remove(src)
    + # assert (dest.get_label() not in src.get_terminator().targets()) + +
    [docs] def out_blocks(self, block: Block) -> List[Block]: + """ + Return the list of blocks in the CFG targeted by + the Terminator of Block block. + """ + return [self.get_block(dest) for dest in block.get_terminator().targets()]
    + +
    [docs] def gather_defs(self) -> Dict[Any, Set[Block]]: + """ + Return a dictionary associating variables to all the blocks + containing one of their definitions. + """ + defs: Dict[Operand, Set[Block]] = dict() + for b in self.get_blocks(): + for i in b.get_all_statements(): + for v in i.defined(): + if v not in defs: + defs[v] = {b} + else: + defs[v].add(b) + return defs
    + +
    [docs] def iter_statements(self, f) -> None: + """Apply f to all instructions in all the blocks.""" + for b in self.get_blocks(): + b.iter_statements(f)
    + +
    [docs] def linearize_naive(self) -> Iterator[Statement]: + """ + Linearize the given control flow graph as a list of instructions. + Naive procedure that adds jumps everywhere. + """ + for label, block in self._blocks.items(): + yield label + for i in block._instructions: + yield i + match block.get_terminator(): + case BranchingTerminator() as j: + # In case of conditional jump, add the missing edge + yield ConditionalJump(j.cond, j.op1, j.op2, j.label_then) + yield AbsoluteJump(j.label_else) + case AbsoluteJump() as j: + yield AbsoluteJump(j.label) + case Return(): + yield AbsoluteJump(self.get_end())
    + +
    [docs] def print_code(self, output, linearize=(lambda cfg: list(cfg.linearize_naive())), + comment=None) -> None: + """Print the linearization of the CFG.""" + statements = linearize(self) + _print_code(statements, self.fdata, output, init_label=self._start, + fin_label=self._end, fin_div0=False, comment=comment)
    + +
    [docs] def print_dot(self, filename, DF=None, view=False) -> None: # pragma: no cover + """Print the CFG as a graph.""" + graph = Digraph() + # nodes + for name, blk in self._blocks.items(): + if DF is not None: + df_str = "{}" if blk not in DF or not len(DF[blk]) else str(DF[blk]) + df_lab = blk.to_dot() + "\n\nDominance frontier:\n" + df_str + else: + df_lab = blk.to_dot() + graph.node(str(blk._label), label=df_lab, shape='rectangle') + # edges + for name, blk in self._blocks.items(): + for child in blk.get_terminator().targets(): + graph.edge(str(blk._label), str(child)) + graph.render(filename, view=view)
    +
    + +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/docs/html/_modules/Lib/Errors.html b/docs/html/_modules/Lib/Errors.html index 3664bb0..6d661b7 100644 --- a/docs/html/_modules/Lib/Errors.html +++ b/docs/html/_modules/Lib/Errors.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/_modules/Lib/FunctionData.html b/docs/html/_modules/Lib/FunctionData.html index a0ccdb2..c0e5908 100644 --- a/docs/html/_modules/Lib/FunctionData.html +++ b/docs/html/_modules/Lib/FunctionData.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/_modules/Lib/LinearCode.html b/docs/html/_modules/Lib/LinearCode.html index 85c1c47..af2b72f 100644 --- a/docs/html/_modules/Lib/LinearCode.html +++ b/docs/html/_modules/Lib/LinearCode.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/_modules/Lib/Operands.html b/docs/html/_modules/Lib/Operands.html index 15133cc..befdd1f 100644 --- a/docs/html/_modules/Lib/Operands.html +++ b/docs/html/_modules/Lib/Operands.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/_modules/Lib/RiscV.html b/docs/html/_modules/Lib/RiscV.html index ca45afb..9ecc4f4 100644 --- a/docs/html/_modules/Lib/RiscV.html +++ b/docs/html/_modules/Lib/RiscV.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/_modules/Lib/Statement.html b/docs/html/_modules/Lib/Statement.html index d64c780..66469b0 100644 --- a/docs/html/_modules/Lib/Statement.html +++ b/docs/html/_modules/Lib/Statement.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/_modules/Lib/Terminator.html b/docs/html/_modules/Lib/Terminator.html new file mode 100644 index 0000000..80942ff --- /dev/null +++ b/docs/html/_modules/Lib/Terminator.html @@ -0,0 +1,261 @@ + + + + + + Lib.Terminator — MiniC documentation + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +

    Source code for Lib.Terminator

    +"""
    +MIF08, CAP, CFG library - Terminators.
    +
    +Each :py:class:`block <Lib.CFG.Block>` of a :py:class:`CFG <Lib.CFG.CFG>`
    +ends with a branching instruction called a terminator.
    +There are three kinds of terminators:
    +
    +- :py:class:`Lib.Statement.AbsoluteJump` is a non-conditional jump
    +  to another block of the CFG
    +- :py:class:`BranchingTerminator` is a conditional branching
    +  instruction with two successor blocks.
    +  Unlike the class :py:class:`ConditionalJump <Lib.Statement.ConditionalJump>`
    +  that was used in :py:class:`LinearCode <Lib.LinearCode.LinearCode>`,
    +  both successor labels have to be specified.
    +- :py:class:`Return` marks the end of the function
    +
    +During the construction of the CFG, :py:func:`jump2terminator` builds
    +a terminator for each extracted chunk of instructions.
    +"""
    +
    +from dataclasses import dataclass
    +from typing import List, Dict
    +from Lib.Errors import MiniCInternalError
    +from Lib.Operands import Operand, Renamer, Temporary, Condition
    +from Lib.Statement import AbsoluteJump, ConditionalJump, Instruction, Label, Statement
    +
    +
    +
    [docs]@dataclass(unsafe_hash=True) +class Return(Statement): + """A terminator that marks the end of the function.""" + + def __str__(self): + return ("return") + +
    [docs] def printIns(self, stream): + print("return", file=stream)
    + +
    [docs] def targets(self) -> List[Label]: + """Return the labels targetted by the Return terminator.""" + return []
    + +
    [docs] def args(self) -> List[Operand]: + return []
    + +
    [docs] def rename(self, renamer: Renamer): + pass
    + +
    [docs] def substitute(self, subst: Dict[Operand, Operand]): + if subst != {}: + raise Exception( + "substitute: No possible substitution on instruction {}" + .format(self)) + return self
    + +
    [docs] def with_args(self, new_args: List[Operand]): + if new_args != []: + raise Exception( + "substitute: No possible substitution on instruction {}" + .format(self)) + return self
    + +
    [docs] def is_read_only(self) -> bool: + return True
    + + +
    [docs]@dataclass(init=False) +class BranchingTerminator(Instruction): + """A terminating statement with a condition.""" + + #: The condition of the branch + cond: Condition + #: The destination label if the condition is true + label_then: Label + #: The destination label if the condition is false + label_else: Label + #: The first operand of the condition + op1: Operand + #: The second operand of the condition + op2: Operand + _read_only = True + + def __init__(self, cond: Condition, op1: Operand, op2: Operand, + label_then: Label, label_else: Label): + self.cond = cond + self.label_then = label_then + self.label_else = label_else + self.op1 = op1 + self.op2 = op2 + self.ins = str(self.cond) + +
    [docs] def args(self) -> List[Operand]: + return [self.op1, self.op2, self.label_then, self.label_else]
    + +
    [docs] def targets(self) -> List[Label]: + """Return the labels targetted by the Branching terminator.""" + return [self.label_then, self.label_else]
    + +
    [docs] def rename(self, renamer: Renamer): + if isinstance(self.op1, Temporary): + self.op1 = renamer.replace(self.op1) + if isinstance(self.op2, Temporary): + self.op2 = renamer.replace(self.op2)
    + +
    [docs] def substitute(self, subst: Dict[Operand, Operand]): + for op in subst: + if op not in self.args(): + raise Exception( + "substitute: Operand {} is not present in instruction {}" + .format(op, self)) + op1 = subst.get(self.op1, self.op1) if isinstance(self.op1, Temporary) \ + else self.op1 + op2 = subst.get(self.op2, self.op2) if isinstance(self.op2, Temporary) \ + else self.op2 + return BranchingTerminator(self.cond, op1, op2, self.label_then, self.label_else)
    + +
    [docs] def with_args(self, new_args: List[Operand]): + if len(new_args) != 4: + raise Exception( + "substitute: Invalid number of arguments for instruction {}, expected 4 got {}" + .format(self, new_args)) + op1 = new_args[0] + op2 = new_args[1] + return BranchingTerminator(self.cond, op1, op2, self.label_then, self.label_else)
    + + def __hash__(self): + return hash(super)
    + + +Terminator = Return | AbsoluteJump | BranchingTerminator +"""Type alias for terminators""" + + +
    [docs]def jump2terminator(j: ConditionalJump | AbsoluteJump | None, + next_label: Label | None) -> Terminator: + """ + Construct the Terminator associated to the potential jump j + to the potential label next_label. + """ + match j: + case ConditionalJump(): + if (next_label is None): + raise MiniCInternalError( + "jump2terminator: Missing secondary label for instruction {}" + .format(j)) + label_else = next_label + return BranchingTerminator(j.cond, j.op1, j.op2, j.label, label_else) + case AbsoluteJump(): + return AbsoluteJump(label=j.label) + case _: + if next_label: + return AbsoluteJump(next_label) + else: + return Return()
    +
    + +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/docs/html/_modules/index.html b/docs/html/_modules/index.html index f394ee2..2c66b33 100644 --- a/docs/html/_modules/index.html +++ b/docs/html/_modules/index.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • @@ -74,12 +76,14 @@

    All modules for which code is available

    diff --git a/docs/html/_sources/api/Lib.CFG.rst.txt b/docs/html/_sources/api/Lib.CFG.rst.txt new file mode 100644 index 0000000..f66acb6 --- /dev/null +++ b/docs/html/_sources/api/Lib.CFG.rst.txt @@ -0,0 +1,7 @@ +Lib.CFG module +============== + +.. automodule:: Lib.CFG + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/api/Lib.Terminator.rst.txt b/docs/html/_sources/api/Lib.Terminator.rst.txt new file mode 100644 index 0000000..47a406c --- /dev/null +++ b/docs/html/_sources/api/Lib.Terminator.rst.txt @@ -0,0 +1,7 @@ +Lib.Terminator module +===================== + +.. automodule:: Lib.Terminator + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/api/Lib.rst.txt b/docs/html/_sources/api/Lib.rst.txt index 9de53f0..ed2c967 100644 --- a/docs/html/_sources/api/Lib.rst.txt +++ b/docs/html/_sources/api/Lib.rst.txt @@ -8,12 +8,14 @@ Submodules :maxdepth: 4 Lib.Allocator + Lib.CFG Lib.Errors Lib.FunctionData Lib.LinearCode Lib.Operands Lib.RiscV Lib.Statement + Lib.Terminator Module contents --------------- diff --git a/docs/html/api/Lib.Allocator.html b/docs/html/api/Lib.Allocator.html index 7dfcdf7..eac9a05 100644 --- a/docs/html/api/Lib.Allocator.html +++ b/docs/html/api/Lib.Allocator.html @@ -18,6 +18,7 @@ + @@ -62,6 +63,8 @@ +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • @@ -159,6 +162,7 @@ Fail if there are too many temporaries.


    diff --git a/docs/html/api/Lib.CFG.html b/docs/html/api/Lib.CFG.html new file mode 100644 index 0000000..14a7d9e --- /dev/null +++ b/docs/html/api/Lib.CFG.html @@ -0,0 +1,372 @@ + + + + + + + Lib.CFG module — MiniC documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Lib.CFG module

    +

    Classes for a RiscV CFG: CFG for the CFG itself, +and Block for its basic blocks.

    +
    +
    +class Lib.CFG.Block(label: Label, insts: List[Instru3A | Comment], terminator: Return | AbsoluteJump | BranchingTerminator)[source]
    +

    Bases: object

    +

    A basic block of a CFG is made of three main parts:

    +
      +
    • a start label that uniquely identifies the block in the CFG

    • +
    • the main body of the block, a list of instructions +(excluding labels, jumps and branching instructions)

    • +
    • a terminator +that represents the final jump or branching instruction of the block, +and points to the successors of the block. +See the documentation for Lib.Terminator.Terminator for further explanations.

    • +
    +
    +
    +to_dot() str[source]
    +

    Outputs all statements of the block as a string.

    +
    + +
    +
    +get_body() List[Instru3A | Comment][source]
    +

    Return the statements in the body of the block (no phi-node nor the terminator).

    +
    + +
    +
    +get_all_statements() List[Statement][source]
    +

    Return all statements of the block +(including phi-nodes and the terminator, but not the label of the block).

    +
    + +
    +
    +get_body_and_terminator() List[Statement][source]
    +

    Return all statements of the block, except phi-nodes +(and the label of the block).

    +
    + +
    +
    +get_label() Label[source]
    +

    Return the label of the block.

    +
    + +
    +
    +get_in() List[Block][source]
    +

    Return the list of blocks with an edge to the considered block.

    +
    + +
    +
    +get_terminator() Return | AbsoluteJump | BranchingTerminator[source]
    +

    Return the terminator of the block.

    +
    + +
    +
    +set_terminator(term: Return | AbsoluteJump | BranchingTerminator) None[source]
    +

    Set the terminator of the block.

    +
    + +
    +
    +get_phis() List[Statement][source]
    +

    Return the list of all φ instructions of the block.

    +
    + +
    +
    +add_phi(phi: Statement) None[source]
    +

    Add a φ instruction to the block.

    +
    + +
    +
    +set_phis(phis: List[Statement]) None[source]
    +

    Replace the φ instructions in the block by the given list phis.

    +
    + +
    +
    +remove_all_phis() None[source]
    +

    Remove all φ instructions in the block.

    +
    + +
    +
    +iter_statements(f) None[source]
    +

    Iterate over instructions. +For each real instruction i (not label or comment), replace it +with the list of instructions given by f(i).

    +

    Assume there is no phi-node.

    +
    + +
    +
    +add_instruction(instr: Instru3A | Comment) None[source]
    +

    Add an instruction to the body of the block.

    +
    + +
    + +
    +
    +class Lib.CFG.CFG(fdata: FunctionData)[source]
    +

    Bases: object

    +

    A complete control-flow graph representing a function. +This class is mainly made of a list of basic Block, +a label indicating the entry point of the function, +and an exit label.

    +

    As with linear code, metadata about the function can be found +in the fdata member variable.

    +
    +
    +fdata: FunctionData
    +

    Metadata about the function represented by this CFG

    +
    + +
    +
    +get_start() Label[source]
    +

    Return the entry label of the CFG.

    +
    + +
    +
    +set_start(start: Label) None[source]
    +

    Set the entry label of the CFG.

    +
    + +
    +
    +get_end() Label[source]
    +

    Return the exit label of the CFG.

    +
    + +
    +
    +add_block(blk: Block) None[source]
    +

    Add a new block to the CFG.

    +
    + +
    +
    +get_block(name: Label) Block[source]
    +

    Return the block with label name.

    +
    + +
    +
    +get_blocks() List[Block][source]
    +

    Return all the blocks.

    +
    + +
    +
    +get_entries() List[Block][source]
    +

    Return all the blocks with no predecessors.

    +
    + +
    +
    +add_edge(src: Block, dest: Block) None[source]
    +

    Add the edge src -> dest in the control flow graph.

    +
    + +
    +
    +remove_edge(src: Block, dest: Block) None[source]
    +

    Remove the edge src -> dest in the control flow graph.

    +
    + +
    +
    +out_blocks(block: Block) List[Block][source]
    +

    Return the list of blocks in the CFG targeted by +the Terminator of Block block.

    +
    + +
    +
    +gather_defs() Dict[Any, Set[Block]][source]
    +

    Return a dictionary associating variables to all the blocks +containing one of their definitions.

    +
    + +
    +
    +iter_statements(f) None[source]
    +

    Apply f to all instructions in all the blocks.

    +
    + +
    +
    +linearize_naive() Iterator[Statement][source]
    +

    Linearize the given control flow graph as a list of instructions. +Naive procedure that adds jumps everywhere.

    +
    + +
    +
    +print_code(output, linearize=<function CFG.<lambda>>, comment=None) None[source]
    +

    Print the linearization of the CFG.

    +
    + +
    +
    +print_dot(filename, DF=None, view=False) None[source]
    +

    Print the CFG as a graph.

    +
    + +
    + +
    + + +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/docs/html/api/Lib.Errors.html b/docs/html/api/Lib.Errors.html index 8cc825b..df9cb3b 100644 --- a/docs/html/api/Lib.Errors.html +++ b/docs/html/api/Lib.Errors.html @@ -57,6 +57,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/api/Lib.FunctionData.html b/docs/html/api/Lib.FunctionData.html index 921f9ed..ee298fd 100644 --- a/docs/html/api/Lib.FunctionData.html +++ b/docs/html/api/Lib.FunctionData.html @@ -61,6 +61,8 @@
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/api/Lib.LinearCode.html b/docs/html/api/Lib.LinearCode.html index 27e7da8..570fe01 100644 --- a/docs/html/api/Lib.LinearCode.html +++ b/docs/html/api/Lib.LinearCode.html @@ -64,6 +64,8 @@
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/api/Lib.Operands.html b/docs/html/api/Lib.Operands.html index a5a44f9..f0e61f2 100644 --- a/docs/html/api/Lib.Operands.html +++ b/docs/html/api/Lib.Operands.html @@ -96,6 +96,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/api/Lib.RiscV.html b/docs/html/api/Lib.RiscV.html index 1a17056..623be95 100644 --- a/docs/html/api/Lib.RiscV.html +++ b/docs/html/api/Lib.RiscV.html @@ -67,6 +67,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/api/Lib.Statement.html b/docs/html/api/Lib.Statement.html index 723f17e..da47f62 100644 --- a/docs/html/api/Lib.Statement.html +++ b/docs/html/api/Lib.Statement.html @@ -109,6 +109,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/api/Lib.Terminator.html b/docs/html/api/Lib.Terminator.html new file mode 100644 index 0000000..3bf26eb --- /dev/null +++ b/docs/html/api/Lib.Terminator.html @@ -0,0 +1,287 @@ + + + + + + + Lib.Terminator module — MiniC documentation + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Lib.Terminator module

    +

    MIF08, CAP, CFG library - Terminators.

    +

    Each block of a CFG +ends with a branching instruction called a terminator. +There are three kinds of terminators:

    + +

    During the construction of the CFG, jump2terminator() builds +a terminator for each extracted chunk of instructions.

    +
    +
    +class Lib.Terminator.Return[source]
    +

    Bases: Statement

    +

    A terminator that marks the end of the function.

    +
    +
    +printIns(stream)[source]
    +

    Print the statement on the given output. +Should never be called on the base class.

    +
    + +
    +
    +targets() List[Label][source]
    +

    Return the labels targetted by the Return terminator.

    +
    + +
    +
    +args() List[Operand][source]
    +
    + +
    +
    +rename(renamer: Renamer)[source]
    +
    + +
    +
    +substitute(subst: Dict[Operand, Operand])[source]
    +

    Return a new instruction, cloned from this one, replacing operands +that appear as key in subst by their value.

    +
    + +
    +
    +with_args(new_args: List[Operand])[source]
    +

    Return a new instruction, cloned from this one, where operands have +been replaced by new_args.

    +
    + +
    +
    +is_read_only() bool[source]
    +
    + +
    + +
    +
    +class Lib.Terminator.BranchingTerminator(cond: Condition, op1: Operand, op2: Operand, label_then: Label, label_else: Label)[source]
    +

    Bases: Instruction

    +

    A terminating statement with a condition.

    +
    +
    +cond: Condition
    +

    The condition of the branch

    +
    + +
    +
    +label_then: Label
    +

    The destination label if the condition is true

    +
    + +
    +
    +label_else: Label
    +

    The destination label if the condition is false

    +
    + +
    +
    +op1: Operand
    +

    The first operand of the condition

    +
    + +
    +
    +op2: Operand
    +

    The second operand of the condition

    +
    + +
    +
    +args() List[Operand][source]
    +

    List of operands the instruction takes

    +
    + +
    +
    +targets() List[Label][source]
    +

    Return the labels targetted by the Branching terminator.

    +
    + +
    +
    +rename(renamer: Renamer)[source]
    +
    + +
    +
    +substitute(subst: Dict[Operand, Operand])[source]
    +

    Return a new instruction, cloned from this one, replacing operands +that appear as key in subst by their value.

    +
    + +
    +
    +with_args(new_args: List[Operand])[source]
    +

    Return a new instruction, cloned from this one, where operands have +been replaced by new_args.

    +
    + +
    + +
    +
    +Lib.Terminator.Terminator = Lib.Terminator.Return | Lib.Statement.AbsoluteJump | Lib.Terminator.BranchingTerminator
    +

    Type alias for terminators

    +
    + +
    +
    +Lib.Terminator.jump2terminator(j: ConditionalJump | AbsoluteJump | None, next_label: Label | None) Return | AbsoluteJump | BranchingTerminator[source]
    +

    Construct the Terminator associated to the potential jump j +to the potential label next_label.

    +
    + +
    + + +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/docs/html/api/Lib.html b/docs/html/api/Lib.html index ea9a9c5..e292de4 100644 --- a/docs/html/api/Lib.html +++ b/docs/html/api/Lib.html @@ -48,6 +48,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • @@ -94,6 +96,45 @@ +
  • Lib.CFG module +
  • Lib.Errors module
  • +
  • Lib.Terminator module +
  • diff --git a/docs/html/api/modules.html b/docs/html/api/modules.html index 27a146f..e1c670d 100644 --- a/docs/html/api/modules.html +++ b/docs/html/api/modules.html @@ -48,6 +48,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • @@ -85,6 +87,11 @@
  • NaiveAllocator
  • +
  • Lib.CFG module +
  • Lib.Errors module
  • +
  • Lib.Terminator module +
  • Module contents
  • diff --git a/docs/html/genindex.html b/docs/html/genindex.html index fa6069e..42a447f 100644 --- a/docs/html/genindex.html +++ b/docs/html/genindex.html @@ -47,6 +47,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • @@ -77,6 +79,7 @@
    A + | B | C | D | F @@ -109,16 +112,26 @@
  • AbsoluteJump (class in Lib.Statement)
  • add() (in module Lib.RiscV) +
  • +
  • add_block() (Lib.CFG.CFG method)
  • add_comment() (Lib.LinearCode.LinearCode method)
  • -
  • add_instruction() (Lib.LinearCode.LinearCode method) +
  • add_edge() (Lib.CFG.CFG method)
  • +
  • add_instruction() (Lib.CFG.Block method) + +
  • add_instruction_PRINTLN_INT() (Lib.LinearCode.LinearCode method)
  • +

    B

    + + + +
    +

    C

    @@ -466,6 +589,10 @@
  • regset_to_string() (in module Lib.Statement)
  • rem() (in module Lib.RiscV) +
  • +
  • remove_all_phis() (Lib.CFG.Block method) +
  • +
  • remove_edge() (Lib.CFG.CFG method)
  • rename() (Lib.Statement.AbsoluteJump method) @@ -475,6 +602,10 @@
  • (Lib.Statement.Instru3A method)
  • (Lib.Statement.Instruction method) +
  • +
  • (Lib.Terminator.BranchingTerminator method) +
  • +
  • (Lib.Terminator.Return method)
  • @@ -489,6 +620,8 @@
  • (Lib.Operands.Renamer method)
  • +
  • Return (class in Lib.Terminator) +
  • rewriteCode() (Lib.Allocator.Allocator method)
  • @@ -500,15 +633,21 @@
  • S (in module Lib.Operands)
  • sd() (in module Lib.RiscV) +
  • +
  • set_phis() (Lib.CFG.Block method) +
  • +
  • set_start() (Lib.CFG.CFG method)
  • set_temp_allocation() (Lib.Operands.TemporaryPool method) +
  • +
  • set_terminator() (Lib.CFG.Block method)
  • SP (in module Lib.Operands) -
  • -
  • Statement (class in Lib.Statement)
  • @@ -530,12 +673,22 @@
  • T (in module Lib.Operands)
  • targets() (Lib.Statement.AbsoluteJump method) + +
  • diff --git a/docs/html/index.html b/docs/html/index.html index 55dc096..c8d27f6 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -49,6 +49,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • @@ -254,6 +256,73 @@ +
  • Control Flow Graph - CFG and Basic blocks +
  • +
  • Control Flow Graph - Terminators +
  • These pages document the various Python sources in the Lib/ @@ -282,8 +351,8 @@ you should understand the naive allocator in the

    Control Flow Graph Intermediate representation

    -

    The classes for the CFG and its basic blocks are in the api/Lib.CFG. -Each block ends with a terminator, as documented in the api/Lib.Terminator.

    +

    The classes for the CFG and its basic blocks are in the Lib.CFG module. +Each block ends with a terminator, as documented in the Lib.Terminator module.

    SSA form

    diff --git a/docs/html/objects.inv b/docs/html/objects.inv index b111a631b5067aa2ce3f09758fbf5a22ee20d852..f9384cfca0f7ec113e59875b4c5a5be4b16d0003 100644 GIT binary patch delta 1534 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 library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • @@ -97,6 +99,11 @@
    + + + + + +
    -
  • print_code() (Lib.LinearCode.LinearCode method) +
  • print_code() (Lib.CFG.CFG method) + +
  • +
  • print_dot() (Lib.CFG.CFG method) + +
  •     Lib.Allocator
        + Lib.CFG +
        @@ -127,6 +134,11 @@     Lib.Statement
        + Lib.Terminator +
    diff --git a/docs/html/search.html b/docs/html/search.html index 8fc86f1..a102560 100644 --- a/docs/html/search.html +++ b/docs/html/search.html @@ -50,6 +50,8 @@
  • Base library - Function data
  • Linear intermediate representation
  • Temporary allocation
  • +
  • Control Flow Graph - CFG and Basic blocks
  • +
  • Control Flow Graph - Terminators
  • diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index e8d30af..945e6dc 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["api/Lib", "api/Lib.Allocator", "api/Lib.Errors", "api/Lib.FunctionData", "api/Lib.LinearCode", "api/Lib.Operands", "api/Lib.RiscV", "api/Lib.Statement", "api/modules", "index"], "filenames": ["api/Lib.rst", "api/Lib.Allocator.rst", "api/Lib.Errors.rst", "api/Lib.FunctionData.rst", "api/Lib.LinearCode.rst", "api/Lib.Operands.rst", "api/Lib.RiscV.rst", "api/Lib.Statement.rst", "api/modules.rst", "index.rst"], "titles": ["Lib package", "Lib.Allocator module", "Lib.Errors module", "Lib.FunctionData module", "Lib.LinearCode module", "Lib.Operands module", "Lib.RiscV module", "Lib.Statement module", "MiniC", "Welcome to MiniC\u2019s documentation!"], "terms": {"alloc": [0, 4, 5, 8], "prepar": [0, 1, 9], "replac": [0, 1, 4, 5, 7, 9], "rewritecod": [0, 1, 9], "naivealloc": [0, 1, 8, 9], "error": [0, 8, 9], "minicruntimeerror": [0, 2, 8, 9], "minicinternalerror": [0, 2, 8, 9], "minicunsupportederror": [0, 2, 8, 9], "minictypeerror": [0, 2, 8, 9], "allocationerror": [0, 2, 8, 9], "functiondata": [0, 1, 4, 8, 9], "get_nam": [0, 3, 9], "fresh_tmp": [0, 3, 5, 9], "fresh_offset": [0, 3, 9], "get_offset": [0, 3, 5, 9], "fresh_label": [0, 3, 9], "get_label_div_by_zero": [0, 3, 9], "linearcod": [0, 1, 3, 8, 9], "fdata": [0, 1, 3, 4, 9], "add_instruct": [0, 4, 9], "iter_stat": [0, 1, 4, 9], "get_instruct": [0, 4, 9], "add_label": [0, 4, 9], "add_com": [0, 4, 9], "add_instruction_println_int": [0, 4, 9], "print_cod": [0, 4, 9], "print_dot": [0, 4, 9], "operand": [0, 1, 3, 6, 7, 8, 9], "condit": [0, 5, 6, 7, 8, 9], "negat": [0, 5, 9], "function": [0, 3, 4, 5, 6, 7, 8, 9], "dataloc": [0, 4, 5, 8, 9], "regist": [0, 1, 5, 8, 9], "zero": [0, 5, 8, 9], "ra": [0, 5, 8, 9], "sp": [0, 5, 8, 9], "gp": [0, 5, 8, 9], "tp": [0, 5, 8, 9], "A": [0, 5, 7, 8, 9], "": [0, 4, 5, 8], "t": [0, 5, 8, 9], "a0": [0, 5, 8, 9], "a1": [0, 5, 8, 9], "fp": [0, 3, 5, 8, 9], "gp_reg": [0, 5, 8, 9], "offset": [0, 3, 5, 8, 9], "immedi": [0, 5, 6, 8, 9], "temporari": [0, 1, 3, 4, 5, 8], "get_alloced_loc": [0, 5, 9], "temporarypool": [0, 1, 3, 5, 8, 9], "get_all_temp": [0, 5, 9], "add_tmp": [0, 5, 9], "set_temp_alloc": [0, 1, 5, 9], "renam": [0, 5, 7, 8, 9], "fresh": [0, 3, 5, 9], "defin": [0, 1, 3, 5, 6, 7, 9], "copi": [0, 5, 9], "riscv": [0, 3, 4, 5, 7, 8, 9], "call": [0, 1, 4, 5, 6, 7, 8, 9], "jump": [0, 6, 7, 8, 9], "conditional_jump": [0, 6, 8, 9], "add": [0, 1, 4, 5, 6, 8, 9], "mul": [0, 6, 8, 9], "div": [0, 6, 8, 9], "rem": [0, 6, 8, 9], "sub": [0, 6, 8, 9], "land": [0, 6, 8, 9], "lor": [0, 6, 8, 9], "xor": [0, 6, 8, 9], "li": [0, 6, 8, 9], "mv": [0, 6, 8, 9], "ld": [0, 6, 8, 9], "sd": [0, 6, 8, 9], "statement": [0, 8, 9], "regset_to_str": [0, 7, 8, 9], "us": [0, 3, 5, 7, 9], "substitut": [0, 7, 9], "with_arg": [0, 7, 9], "printin": [0, 7, 9], "comment": [0, 4, 7, 8, 9], "label": [0, 3, 4, 6, 7, 8, 9], "name": [0, 3, 4, 5, 7, 9], "instruct": [0, 1, 4, 6, 7, 8, 9], "ins": [0, 7, 9], "is_read_onli": [0, 7, 9], "arg": [0, 7, 9], "instru3a": [0, 4, 6, 7, 8, 9], "absolutejump": [0, 4, 6, 7, 8, 9], "target": [0, 7, 9], "conditionaljump": [0, 4, 7, 8, 9], "cond": [0, 6, 7, 9], "op1": [0, 6, 7, 9], "op2": [0, 6, 7, 9], "thi": [1, 3, 5, 6, 7], "file": [1, 3, 4, 5], "base": [1, 2, 3, 4, 5, 7], "class": [1, 3, 4, 5, 7, 9], "na\u00efv": 1, "implement": [1, 9], "sourc": [1, 2, 3, 4, 5, 6, 7, 9], "object": [1, 3, 4, 5, 7, 9], "gener": [1, 4, 5], "naiv": [1, 9], "allinmem": 1, "smart": 1, "all": [1, 5, 9], "code": [1, 4, 6, 9], "actual": [1, 5], "data": [1, 5, 9], "locat": [1, 5, 7], "i": [1, 3, 4, 5, 6, 7], "done": 1, "two": 1, "step": 1, "first": [1, 7], "respons": 1, "map": [1, 5], "from": [1, 5, 7], "where": [1, 7], "thei": 1, "should": [1, 7, 9], "store": [1, 3], "memori": [1, 3, 5, 9], "Then": 1, "each": [1, 4, 9], "order": 1, "previous": 1, "assign": 1, "possibli": 1, "some": [1, 3, 4, 9], "befor": [1, 9], "after": 1, "concret": 1, "return": [1, 3, 4, 5, 7], "list": [1, 4, 5, 7, 9], "origin": 1, "The": [1, 4, 5, 7, 9], "iter": [1, 4], "over": [1, 4], "handl": 1, "transpar": 1, "none": [1, 4, 5, 7], "old_instr": 1, "transform": 1, "an": [1, 4, 7], "listcod": 1, "modifi": 1, "try": 1, "fail": 1, "ar": [1, 3, 5, 7, 9], "more": 1, "than": [1, 5], "correspond": 1, "too": 1, "mani": 1, "except": 2, "contain": [3, 4], "metadata": 3, "well": 3, "util": [3, 4, 7], "common": 3, "differ": [3, 5], "intermedi": 3, "represent": [3, 4], "str": [3, 4, 5, 7], "variabl": [3, 4], "div_by_zero": 3, "usual": 3, "indirectli": 3, "through": 3, "we": [3, 5, 9], "work": [3, 9], "new": [3, 4, 5, 7], "which": [3, 5, 7], "ad": 3, "pool": [3, 5], "stack": 3, "decreas": 3, "rel": 3, "int": [3, 5], "current": 3, "uniqu": 3, "given": [3, 4, 7], "string": [3, 5], "cap": [4, 6], "codegener": [4, 6], "api": [4, 6, 9], "linear": 4, "program": 4, "repeatedli": 4, "codegen": 4, "visitor": 4, "build": [4, 5], "complet": 4, "member": 4, "meta": 4, "inform": 4, "instanc": 4, "see": 4, "For": 4, "debug": 4, "purpos": [4, 5], "allow": [4, 5, 9], "print": [4, 7], "also": [4, 5], "relev": 4, "f": 4, "real": 4, "reg": 4, "integ": [4, 5], "valu": [4, 5, 7], "newlin": 4, "expand": 4, "output": [4, 7], "text": 4, "path": 4, "filenam": 4, "df": 4, "view": 4, "fals": 4, "graph": 4, "its": [5, 7, 9], "subclass": 5, "itself": 5, "ha": 5, "address": [5, 7, 9], "constant": 5, "yet": 5, "shortcut": 5, "optyp": 5, "e": 5, "comparison": 5, "condjump": 5, "exampl": 5, "usag": 5, "beq": [5, 6], "branch": [5, 7], "equal": 5, "minicpars": [5, 6], "lt": 5, "lower": 5, "constructor": 5, "argument": [5, 9], "shall": 5, "all_op": 5, "oper": 5, "gt": 5, "one": [5, 7], "kei": [5, 7], "opdict": 5, "method": 5, "get": 5, "opposit": 5, "either": 5, "place": 5, "number": 5, "physic": 5, "cours": 5, "a2": 5, "a3": 5, "a4": 5, "a5": 5, "a6": 5, "a7": 5, "s1": 5, "s2": 5, "s3": 5, "s4": 5, "s5": 5, "s6": 5, "s7": 5, "s8": 5, "s9": 5, "s10": 5, "s11": 5, "t0": 5, "t1": 5, "t2": 5, "t3": 5, "t4": 5, "t5": 5, "t6": 5, "frame": 5, "pointer": 5, "save": 5, "0": 5, "usabl": 5, "basereg": 5, "comput": 5, "val": 5, "been": [5, 7], "It": [5, 7], "later": 5, "manag": 5, "dict": [5, 7], "give": [5, 9], "must": 5, "other": [5, 7], "typic": 5, "type": 5, "enforc": 5, "check": 5, "inde": 5, "bool": 5, "true": [5, 7], "mif08": 6, "uncondit": 6, "wrapper": 6, "around": 6, "bge": 6, "bgt": 6, "c": 6, "like": 6, "eq": 6, "dr": 6, "sr1": 6, "sr2orimm7": 6, "And": 6, "cannot": 6, "due": 6, "python": [6, 9], "Or": 6, "imm7": 6, "sr": 6, "mem": 6, "asm": 7, "inherit": 7, "In": 7, "turn": 7, "regular": 7, "non": [7, 9], "3": [7, 9], "registerset": 7, "pretti": 7, "set": 7, "written": 7, "read": 7, "subst": 7, "tstatement": 7, "clone": 7, "appear": [7, 9], "new_arg": 7, "have": [7, 9], "stream": 7, "never": 7, "both": 7, "onli": 7, "otherwis": 7, "consid": 7, "destin": 7, "take": [7, 9], "absolut": 7, "specif": 7, "kind": [7, 9], "j": 7, "lib": [8, 9], "packag": 8, "submodul": 8, "modul": [8, 9], "content": 8, "risc": 9, "v": 9, "These": 9, "page": 9, "variou": 9, "folder": 9, "you": 9, "edit": 9, "them": 9, "repres": 9, "assembli": 9, "won": 9, "creat": 9, "directli": 9, "veri": 9, "often": 9, "instead": 9, "easili": 9, "standard": 9, "pseudo": 9, "At": 9, "point": 9, "need": 9, "basic": 9, "about": 9, "orient": 9, "those": 9, "present": 9, "model": 9, "lab": 9, "4a": 9, "understand": 9, "cfg": 9, "block": 9, "end": 9, "termin": 9, "translat": 9, "make": 9, "domin": 9, "frontier": 9, "phi": 9, "node": 9, "special": 9, "phinod": 9, "index": 9, "search": 9}, "objects": {"": [[0, 0, 0, "-", "Lib"]], "Lib": [[1, 0, 0, "-", "Allocator"], [2, 0, 0, "-", "Errors"], [3, 0, 0, "-", "FunctionData"], [4, 0, 0, "-", "LinearCode"], [5, 0, 0, "-", "Operands"], [6, 0, 0, "-", "RiscV"], [7, 0, 0, "-", "Statement"]], "Lib.Allocator": [[1, 1, 1, "", "Allocator"], [1, 1, 1, "", "NaiveAllocator"]], "Lib.Allocator.Allocator": [[1, 2, 1, "", "prepare"], [1, 2, 1, "", "replace"], [1, 2, 1, "", "rewriteCode"]], "Lib.Allocator.NaiveAllocator": [[1, 2, 1, "", "prepare"], [1, 2, 1, "", "replace"]], "Lib.Errors": [[2, 3, 1, "", "AllocationError"], [2, 3, 1, "", "MiniCInternalError"], [2, 3, 1, "", "MiniCRuntimeError"], [2, 3, 1, "", "MiniCTypeError"], [2, 3, 1, "", "MiniCUnsupportedError"]], "Lib.FunctionData": [[3, 1, 1, "", "FunctionData"]], "Lib.FunctionData.FunctionData": [[3, 2, 1, "", "fresh_label"], [3, 2, 1, "", "fresh_offset"], [3, 2, 1, "", "fresh_tmp"], [3, 2, 1, "", "get_label_div_by_zero"], [3, 2, 1, "", "get_name"], [3, 2, 1, "", "get_offset"]], "Lib.LinearCode": [[4, 1, 1, "", "LinearCode"]], "Lib.LinearCode.LinearCode": [[4, 2, 1, "", "add_comment"], [4, 2, 1, "", "add_instruction"], [4, 2, 1, "", "add_instruction_PRINTLN_INT"], [4, 2, 1, "", "add_label"], [4, 4, 1, "", "fdata"], [4, 2, 1, "", "get_instructions"], [4, 2, 1, "", "iter_statements"], [4, 2, 1, "", "print_code"], [4, 2, 1, "", "print_dot"]], "Lib.Operands": [[5, 5, 1, "", "A"], [5, 5, 1, "", "A0"], [5, 5, 1, "", "A1"], [5, 1, 1, "", "Condition"], [5, 1, 1, "", "DataLocation"], [5, 5, 1, "", "FP"], [5, 1, 1, "", "Function"], [5, 5, 1, "", "GP"], [5, 5, 1, "", "GP_REGS"], [5, 1, 1, "", "Immediate"], [5, 1, 1, "", "Offset"], [5, 1, 1, "", "Operand"], [5, 5, 1, "", "RA"], [5, 1, 1, "", "Register"], [5, 1, 1, "", "Renamer"], [5, 5, 1, "", "S"], [5, 5, 1, "", "SP"], [5, 5, 1, "", "T"], [5, 5, 1, "", "TP"], [5, 1, 1, "", "Temporary"], [5, 1, 1, "", "TemporaryPool"], [5, 5, 1, "", "ZERO"]], "Lib.Operands.Condition": [[5, 2, 1, "", "negate"]], "Lib.Operands.Offset": [[5, 2, 1, "", "get_offset"]], "Lib.Operands.Renamer": [[5, 2, 1, "", "copy"], [5, 2, 1, "", "defined"], [5, 2, 1, "", "fresh"], [5, 2, 1, "", "replace"]], "Lib.Operands.Temporary": [[5, 2, 1, "", "get_alloced_loc"]], "Lib.Operands.TemporaryPool": [[5, 2, 1, "", "add_tmp"], [5, 2, 1, "", "fresh_tmp"], [5, 2, 1, "", "get_all_temps"], [5, 2, 1, "", "get_alloced_loc"], [5, 2, 1, "", "set_temp_allocation"]], "Lib.RiscV": [[6, 6, 1, "", "add"], [6, 6, 1, "", "call"], [6, 6, 1, "", "conditional_jump"], [6, 6, 1, "", "div"], [6, 6, 1, "", "jump"], [6, 6, 1, "", "land"], [6, 6, 1, "", "ld"], [6, 6, 1, "", "li"], [6, 6, 1, "", "lor"], [6, 6, 1, "", "mul"], [6, 6, 1, "", "mv"], [6, 6, 1, "", "rem"], [6, 6, 1, "", "sd"], [6, 6, 1, "", "sub"], [6, 6, 1, "", "xor"]], "Lib.Statement": [[7, 1, 1, "", "AbsoluteJump"], [7, 1, 1, "", "Comment"], [7, 1, 1, "", "ConditionalJump"], [7, 1, 1, "", "Instru3A"], [7, 1, 1, "", "Instruction"], [7, 1, 1, "", "Label"], [7, 1, 1, "", "Statement"], [7, 6, 1, "", "regset_to_string"]], "Lib.Statement.AbsoluteJump": [[7, 2, 1, "", "args"], [7, 4, 1, "", "ins"], [7, 4, 1, "", "label"], [7, 2, 1, "", "rename"], [7, 2, 1, "", "substitute"], [7, 2, 1, "", "targets"], [7, 2, 1, "", "with_args"]], "Lib.Statement.Comment": [[7, 4, 1, "", "comment"], [7, 2, 1, "", "printIns"]], "Lib.Statement.ConditionalJump": [[7, 2, 1, "", "args"], [7, 4, 1, "", "cond"], [7, 4, 1, "", "label"], [7, 4, 1, "", "op1"], [7, 4, 1, "", "op2"], [7, 2, 1, "", "rename"], [7, 2, 1, "", "substitute"], [7, 2, 1, "", "with_args"]], "Lib.Statement.Instru3A": [[7, 2, 1, "", "args"], [7, 2, 1, "", "rename"], [7, 2, 1, "", "substitute"], [7, 2, 1, "", "with_args"]], "Lib.Statement.Instruction": [[7, 2, 1, "", "args"], [7, 2, 1, "", "defined"], [7, 4, 1, "", "ins"], [7, 2, 1, "", "is_read_only"], [7, 2, 1, "", "printIns"], [7, 2, 1, "", "rename"], [7, 2, 1, "", "used"]], "Lib.Statement.Label": [[7, 4, 1, "", "name"], [7, 2, 1, "", "printIns"]], "Lib.Statement.Statement": [[7, 2, 1, "", "defined"], [7, 2, 1, "", "printIns"], [7, 2, 1, "", "substitute"], [7, 2, 1, "", "used"], [7, 2, 1, "", "with_args"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:exception", "4": "py:attribute", "5": "py:data", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "exception", "Python exception"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "data", "Python data"], "6": ["py", "function", "Python function"]}, "titleterms": {"lib": [0, 1, 2, 3, 4, 5, 6, 7], "packag": 0, "submodul": 0, "modul": [0, 1, 2, 3, 4, 5, 6, 7], "content": [0, 9], "alloc": [1, 9], "error": 2, "functiondata": 3, "linearcod": 4, "operand": 5, "riscv": 6, "statement": 7, "minic": [8, 9], "welcom": 9, "": 9, "document": 9, "base": 9, "librari": 9, "linear": 9, "intermedi": 9, "represent": 9, "temporari": 9, "control": 9, "flow": 9, "graph": 9, "ssa": 9, "form": 9, "indic": 9, "tabl": 9}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"Lib package": [[0, "lib-package"]], "Submodules": [[0, "submodules"]], "Module contents": [[0, "module-Lib"]], "Lib.Allocator module": [[1, "module-Lib.Allocator"]], "Lib.Errors module": [[2, "module-Lib.Errors"]], "Lib.FunctionData module": [[3, "module-Lib.FunctionData"]], "Lib.LinearCode module": [[4, "module-Lib.LinearCode"]], "Lib.Operands module": [[5, "module-Lib.Operands"]], "Lib.RiscV module": [[6, "module-Lib.RiscV"]], "Lib.Statement module": [[7, "module-Lib.Statement"]], "MiniC": [[8, "minic"]], "Welcome to MiniC\u2019s documentation!": [[9, "welcome-to-minic-s-documentation"]], "Contents:": [[9, null]], "Base library": [[9, "base-library"]], "Linear Intermediate representation": [[9, "linear-intermediate-representation"]], "Temporary allocation": [[9, "temporary-allocation"]], "Control Flow Graph Intermediate representation": [[9, "control-flow-graph-intermediate-representation"]], "SSA form": [[9, "ssa-form"]], "Indices and tables": [[9, "indices-and-tables"]]}, "indexentries": {"lib": [[0, "module-Lib"]], "module": [[0, "module-Lib"], [1, "module-Lib.Allocator"], [2, "module-Lib.Errors"], [3, "module-Lib.FunctionData"], [4, "module-Lib.LinearCode"], [5, "module-Lib.Operands"], [6, "module-Lib.RiscV"], [7, "module-Lib.Statement"]], "allocator (class in lib.allocator)": [[1, "Lib.Allocator.Allocator"]], "lib.allocator": [[1, "module-Lib.Allocator"]], "naiveallocator (class in lib.allocator)": [[1, "Lib.Allocator.NaiveAllocator"]], "prepare() (lib.allocator.allocator method)": [[1, "Lib.Allocator.Allocator.prepare"]], "prepare() (lib.allocator.naiveallocator method)": [[1, "Lib.Allocator.NaiveAllocator.prepare"]], "replace() (lib.allocator.allocator method)": [[1, "Lib.Allocator.Allocator.replace"]], "replace() (lib.allocator.naiveallocator method)": [[1, "Lib.Allocator.NaiveAllocator.replace"]], "rewritecode() (lib.allocator.allocator method)": [[1, "Lib.Allocator.Allocator.rewriteCode"]], "allocationerror": [[2, "Lib.Errors.AllocationError"]], "lib.errors": [[2, "module-Lib.Errors"]], "minicinternalerror": [[2, "Lib.Errors.MiniCInternalError"]], "minicruntimeerror": [[2, "Lib.Errors.MiniCRuntimeError"]], "minictypeerror": [[2, "Lib.Errors.MiniCTypeError"]], "minicunsupportederror": [[2, "Lib.Errors.MiniCUnsupportedError"]], "functiondata (class in lib.functiondata)": [[3, "Lib.FunctionData.FunctionData"]], "lib.functiondata": [[3, "module-Lib.FunctionData"]], "fresh_label() (lib.functiondata.functiondata method)": [[3, "Lib.FunctionData.FunctionData.fresh_label"]], "fresh_offset() (lib.functiondata.functiondata method)": [[3, "Lib.FunctionData.FunctionData.fresh_offset"]], "fresh_tmp() (lib.functiondata.functiondata method)": [[3, "Lib.FunctionData.FunctionData.fresh_tmp"]], "get_label_div_by_zero() (lib.functiondata.functiondata method)": [[3, "Lib.FunctionData.FunctionData.get_label_div_by_zero"]], "get_name() (lib.functiondata.functiondata method)": [[3, "Lib.FunctionData.FunctionData.get_name"]], "get_offset() (lib.functiondata.functiondata method)": [[3, "Lib.FunctionData.FunctionData.get_offset"]], "lib.linearcode": [[4, "module-Lib.LinearCode"]], "linearcode (class in lib.linearcode)": [[4, "Lib.LinearCode.LinearCode"]], "add_comment() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.add_comment"]], "add_instruction() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.add_instruction"]], "add_instruction_println_int() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.add_instruction_PRINTLN_INT"]], "add_label() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.add_label"]], "fdata (lib.linearcode.linearcode attribute)": [[4, "Lib.LinearCode.LinearCode.fdata"]], "get_instructions() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.get_instructions"]], "iter_statements() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.iter_statements"]], "print_code() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.print_code"]], "print_dot() (lib.linearcode.linearcode method)": [[4, "Lib.LinearCode.LinearCode.print_dot"]], "a (in module lib.operands)": [[5, "Lib.Operands.A"]], "a0 (in module lib.operands)": [[5, "Lib.Operands.A0"]], "a1 (in module lib.operands)": [[5, "Lib.Operands.A1"]], "condition (class in lib.operands)": [[5, "Lib.Operands.Condition"]], "datalocation (class in lib.operands)": [[5, "Lib.Operands.DataLocation"]], "fp (in module lib.operands)": [[5, "Lib.Operands.FP"]], "function (class in lib.operands)": [[5, "Lib.Operands.Function"]], "gp (in module lib.operands)": [[5, "Lib.Operands.GP"]], "gp_regs (in module lib.operands)": [[5, "Lib.Operands.GP_REGS"]], "immediate (class in lib.operands)": [[5, "Lib.Operands.Immediate"]], "lib.operands": [[5, "module-Lib.Operands"]], "offset (class in lib.operands)": [[5, "Lib.Operands.Offset"]], "operand (class in lib.operands)": [[5, "Lib.Operands.Operand"]], "ra (in module lib.operands)": [[5, "Lib.Operands.RA"]], "register (class in lib.operands)": [[5, "Lib.Operands.Register"]], "renamer (class in lib.operands)": [[5, "Lib.Operands.Renamer"]], "s (in module lib.operands)": [[5, "Lib.Operands.S"]], "sp (in module lib.operands)": [[5, "Lib.Operands.SP"]], "t (in module lib.operands)": [[5, "Lib.Operands.T"]], "tp (in module lib.operands)": [[5, "Lib.Operands.TP"]], "temporary (class in lib.operands)": [[5, "Lib.Operands.Temporary"]], "temporarypool (class in lib.operands)": [[5, "Lib.Operands.TemporaryPool"]], "zero (in module lib.operands)": [[5, "Lib.Operands.ZERO"]], "add_tmp() (lib.operands.temporarypool method)": [[5, "Lib.Operands.TemporaryPool.add_tmp"]], "copy() (lib.operands.renamer method)": [[5, "Lib.Operands.Renamer.copy"]], "defined() (lib.operands.renamer method)": [[5, "Lib.Operands.Renamer.defined"]], "fresh() (lib.operands.renamer method)": [[5, "Lib.Operands.Renamer.fresh"]], "fresh_tmp() (lib.operands.temporarypool method)": [[5, "Lib.Operands.TemporaryPool.fresh_tmp"]], "get_all_temps() (lib.operands.temporarypool method)": [[5, "Lib.Operands.TemporaryPool.get_all_temps"]], "get_alloced_loc() (lib.operands.temporary method)": [[5, "Lib.Operands.Temporary.get_alloced_loc"]], "get_alloced_loc() (lib.operands.temporarypool method)": [[5, "Lib.Operands.TemporaryPool.get_alloced_loc"]], "get_offset() (lib.operands.offset method)": [[5, "Lib.Operands.Offset.get_offset"]], "negate() (lib.operands.condition method)": [[5, "Lib.Operands.Condition.negate"]], "replace() (lib.operands.renamer method)": [[5, "Lib.Operands.Renamer.replace"]], "set_temp_allocation() (lib.operands.temporarypool method)": [[5, "Lib.Operands.TemporaryPool.set_temp_allocation"]], "lib.riscv": [[6, "module-Lib.RiscV"]], "add() (in module lib.riscv)": [[6, "Lib.RiscV.add"]], "call() (in module lib.riscv)": [[6, "Lib.RiscV.call"]], "conditional_jump() (in module lib.riscv)": [[6, "Lib.RiscV.conditional_jump"]], "div() (in module lib.riscv)": [[6, "Lib.RiscV.div"]], "jump() (in module lib.riscv)": [[6, "Lib.RiscV.jump"]], "land() (in module lib.riscv)": [[6, "Lib.RiscV.land"]], "ld() (in module lib.riscv)": [[6, "Lib.RiscV.ld"]], "li() (in module lib.riscv)": [[6, "Lib.RiscV.li"]], "lor() (in module lib.riscv)": [[6, "Lib.RiscV.lor"]], "mul() (in module lib.riscv)": [[6, "Lib.RiscV.mul"]], "mv() (in module lib.riscv)": [[6, "Lib.RiscV.mv"]], "rem() (in module lib.riscv)": [[6, "Lib.RiscV.rem"]], "sd() (in module lib.riscv)": [[6, "Lib.RiscV.sd"]], "sub() (in module lib.riscv)": [[6, "Lib.RiscV.sub"]], "xor() (in module lib.riscv)": [[6, "Lib.RiscV.xor"]], "absolutejump (class in lib.statement)": [[7, "Lib.Statement.AbsoluteJump"]], "comment (class in lib.statement)": [[7, "Lib.Statement.Comment"]], "conditionaljump (class in lib.statement)": [[7, "Lib.Statement.ConditionalJump"]], "instru3a (class in lib.statement)": [[7, "Lib.Statement.Instru3A"]], "instruction (class in lib.statement)": [[7, "Lib.Statement.Instruction"]], "label (class in lib.statement)": [[7, "Lib.Statement.Label"]], "lib.statement": [[7, "module-Lib.Statement"]], "statement (class in lib.statement)": [[7, "Lib.Statement.Statement"]], "args() (lib.statement.absolutejump method)": [[7, "Lib.Statement.AbsoluteJump.args"]], "args() (lib.statement.conditionaljump method)": [[7, "Lib.Statement.ConditionalJump.args"]], "args() (lib.statement.instru3a method)": [[7, "Lib.Statement.Instru3A.args"]], "args() (lib.statement.instruction method)": [[7, "Lib.Statement.Instruction.args"]], "comment (lib.statement.comment attribute)": [[7, "Lib.Statement.Comment.comment"]], "cond (lib.statement.conditionaljump attribute)": [[7, "Lib.Statement.ConditionalJump.cond"]], "defined() (lib.statement.instruction method)": [[7, "Lib.Statement.Instruction.defined"]], "defined() (lib.statement.statement method)": [[7, "Lib.Statement.Statement.defined"]], "ins (lib.statement.absolutejump attribute)": [[7, "Lib.Statement.AbsoluteJump.ins"]], "ins (lib.statement.instruction attribute)": [[7, "Lib.Statement.Instruction.ins"]], "is_read_only() (lib.statement.instruction method)": [[7, "Lib.Statement.Instruction.is_read_only"]], "label (lib.statement.absolutejump attribute)": [[7, "Lib.Statement.AbsoluteJump.label"]], "label (lib.statement.conditionaljump attribute)": [[7, "Lib.Statement.ConditionalJump.label"]], "name (lib.statement.label attribute)": [[7, "Lib.Statement.Label.name"]], "op1 (lib.statement.conditionaljump attribute)": [[7, "Lib.Statement.ConditionalJump.op1"]], "op2 (lib.statement.conditionaljump attribute)": [[7, "Lib.Statement.ConditionalJump.op2"]], "printins() (lib.statement.comment method)": [[7, "Lib.Statement.Comment.printIns"]], "printins() (lib.statement.instruction method)": [[7, "Lib.Statement.Instruction.printIns"]], "printins() (lib.statement.label method)": [[7, "Lib.Statement.Label.printIns"]], "printins() (lib.statement.statement method)": [[7, "Lib.Statement.Statement.printIns"]], "regset_to_string() (in module lib.statement)": [[7, "Lib.Statement.regset_to_string"]], "rename() (lib.statement.absolutejump method)": [[7, "Lib.Statement.AbsoluteJump.rename"]], "rename() (lib.statement.conditionaljump method)": [[7, "Lib.Statement.ConditionalJump.rename"]], "rename() (lib.statement.instru3a method)": [[7, "Lib.Statement.Instru3A.rename"]], "rename() (lib.statement.instruction method)": [[7, "Lib.Statement.Instruction.rename"]], "substitute() (lib.statement.absolutejump method)": [[7, "Lib.Statement.AbsoluteJump.substitute"]], "substitute() (lib.statement.conditionaljump method)": [[7, "Lib.Statement.ConditionalJump.substitute"]], "substitute() (lib.statement.instru3a method)": [[7, "Lib.Statement.Instru3A.substitute"]], "substitute() (lib.statement.statement method)": [[7, "Lib.Statement.Statement.substitute"]], "targets() (lib.statement.absolutejump method)": [[7, "Lib.Statement.AbsoluteJump.targets"]], "used() (lib.statement.instruction method)": [[7, "Lib.Statement.Instruction.used"]], "used() (lib.statement.statement method)": [[7, "Lib.Statement.Statement.used"]], "with_args() (lib.statement.absolutejump method)": [[7, "Lib.Statement.AbsoluteJump.with_args"]], "with_args() (lib.statement.conditionaljump method)": [[7, "Lib.Statement.ConditionalJump.with_args"]], "with_args() (lib.statement.instru3a method)": [[7, "Lib.Statement.Instru3A.with_args"]], "with_args() (lib.statement.statement method)": [[7, "Lib.Statement.Statement.with_args"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["api/Lib", "api/Lib.Allocator", "api/Lib.CFG", "api/Lib.Errors", "api/Lib.FunctionData", "api/Lib.LinearCode", "api/Lib.Operands", "api/Lib.RiscV", "api/Lib.Statement", "api/Lib.Terminator", "api/modules", "index"], "filenames": ["api/Lib.rst", "api/Lib.Allocator.rst", "api/Lib.CFG.rst", "api/Lib.Errors.rst", "api/Lib.FunctionData.rst", "api/Lib.LinearCode.rst", "api/Lib.Operands.rst", "api/Lib.RiscV.rst", "api/Lib.Statement.rst", "api/Lib.Terminator.rst", "api/modules.rst", "index.rst"], "titles": ["Lib package", "Lib.Allocator module", "Lib.CFG module", "Lib.Errors module", "Lib.FunctionData module", "Lib.LinearCode module", "Lib.Operands module", "Lib.RiscV module", "Lib.Statement module", "Lib.Terminator module", "MiniC", "Welcome to MiniC\u2019s documentation!"], "terms": {"alloc": [0, 5, 6, 10], "prepar": [0, 1, 11], "replac": [0, 1, 2, 5, 6, 8, 9, 11], "rewritecod": [0, 1, 11], "naivealloc": [0, 1, 10, 11], "cfg": [0, 9, 10, 11], "block": [0, 2, 9, 10, 11], "to_dot": [0, 2, 11], "get_bodi": [0, 2, 11], "get_all_stat": [0, 2, 11], "get_body_and_termin": [0, 2, 11], "get_label": [0, 2, 11], "get_in": [0, 2, 11], "get_termin": [0, 2, 11], "set_termin": [0, 2, 11], "get_phi": [0, 2, 11], "add_phi": [0, 2, 11], "set_phi": [0, 2, 11], "remove_all_phi": [0, 2, 11], "iter_stat": [0, 1, 2, 5, 11], "add_instruct": [0, 2, 5, 11], "fdata": [0, 1, 2, 4, 5, 11], "get_start": [0, 2, 11], "set_start": [0, 2, 11], "get_end": [0, 2, 11], "add_block": [0, 2, 11], "get_block": [0, 2, 11], "get_entri": [0, 2, 11], "add_edg": [0, 2, 11], "remove_edg": [0, 2, 11], "out_block": [0, 2, 11], "gather_def": [0, 2, 11], "linearize_na": [0, 2, 11], "print_cod": [0, 2, 5, 11], "print_dot": [0, 2, 5, 11], "error": [0, 10, 11], "minicruntimeerror": [0, 3, 10, 11], "minicinternalerror": [0, 3, 10, 11], "minicunsupportederror": [0, 3, 10, 11], "minictypeerror": [0, 3, 10, 11], "allocationerror": [0, 3, 10, 11], "functiondata": [0, 1, 2, 5, 10, 11], "get_nam": [0, 4, 11], "fresh_tmp": [0, 4, 6, 11], "fresh_offset": [0, 4, 11], "get_offset": [0, 4, 6, 11], "fresh_label": [0, 4, 11], "get_label_div_by_zero": [0, 4, 11], "linearcod": [0, 1, 4, 9, 10, 11], "get_instruct": [0, 5, 11], "add_label": [0, 5, 11], "add_com": [0, 5, 11], "add_instruction_println_int": [0, 5, 11], "operand": [0, 1, 4, 7, 8, 9, 10, 11], "condit": [0, 6, 7, 8, 9, 10, 11], "negat": [0, 6, 11], "function": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11], "dataloc": [0, 5, 6, 10, 11], "regist": [0, 1, 6, 10, 11], "zero": [0, 6, 10, 11], "ra": [0, 6, 10, 11], "sp": [0, 6, 10, 11], "gp": [0, 6, 10, 11], "tp": [0, 6, 10, 11], "A": [0, 2, 6, 8, 9, 10, 11], "": [0, 5, 6, 10], "t": [0, 6, 10, 11], "a0": [0, 6, 10, 11], "a1": [0, 6, 10, 11], "fp": [0, 4, 6, 10, 11], "gp_reg": [0, 6, 10, 11], "offset": [0, 4, 6, 10, 11], "immedi": [0, 6, 7, 10, 11], "temporari": [0, 1, 4, 5, 6, 10], "get_alloced_loc": [0, 6, 11], "temporarypool": [0, 1, 4, 6, 10, 11], "get_all_temp": [0, 6, 11], "add_tmp": [0, 6, 11], "set_temp_alloc": [0, 1, 6, 11], "renam": [0, 6, 8, 9, 10, 11], "fresh": [0, 4, 6, 11], "defin": [0, 1, 4, 6, 7, 8, 11], "copi": [0, 6, 11], "riscv": [0, 2, 4, 5, 6, 8, 10, 11], "call": [0, 1, 5, 6, 7, 8, 9, 10, 11], "jump": [0, 2, 7, 8, 9, 10, 11], "conditional_jump": [0, 7, 10, 11], "add": [0, 1, 2, 5, 6, 7, 10, 11], "mul": [0, 7, 10, 11], "div": [0, 7, 10, 11], "rem": [0, 7, 10, 11], "sub": [0, 7, 10, 11], "land": [0, 7, 10, 11], "lor": [0, 7, 10, 11], "xor": [0, 7, 10, 11], "li": [0, 7, 10, 11], "mv": [0, 7, 10, 11], "ld": [0, 7, 10, 11], "sd": [0, 7, 10, 11], "statement": [0, 2, 9, 10, 11], "regset_to_str": [0, 8, 10, 11], "us": [0, 4, 6, 8, 9, 11], "substitut": [0, 8, 9, 11], "with_arg": [0, 8, 9, 11], "printin": [0, 8, 9, 11], "comment": [0, 2, 5, 8, 10, 11], "label": [0, 2, 4, 5, 7, 8, 9, 10, 11], "name": [0, 2, 4, 5, 6, 8, 11], "instruct": [0, 1, 2, 5, 7, 8, 9, 10, 11], "ins": [0, 8, 11], "is_read_onli": [0, 8, 9, 11], "arg": [0, 8, 9, 11], "instru3a": [0, 2, 5, 7, 8, 10, 11], "absolutejump": [0, 2, 5, 7, 8, 9, 10, 11], "target": [0, 2, 8, 9, 11], "conditionaljump": [0, 5, 8, 9, 10, 11], "cond": [0, 7, 8, 9, 11], "op1": [0, 7, 8, 9, 11], "op2": [0, 7, 8, 9, 11], "termin": [0, 2, 10, 11], "return": [0, 1, 2, 4, 5, 6, 8, 9, 10, 11], "branchingtermin": [0, 2, 9, 10, 11], "label_then": [0, 9, 11], "label_els": [0, 9, 11], "jump2termin": [0, 9, 10, 11], "thi": [1, 2, 4, 6, 7, 8, 9], "file": [1, 4, 5, 6], "base": [1, 2, 3, 4, 5, 6, 8, 9], "class": [1, 2, 4, 5, 6, 8, 9, 11], "na\u00efv": 1, "implement": [1, 11], "sourc": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11], "object": [1, 2, 4, 5, 6, 8, 11], "gener": [1, 5, 6], "naiv": [1, 2, 11], "allinmem": 1, "smart": 1, "all": [1, 2, 6, 11], "code": [1, 2, 5, 7, 11], "actual": [1, 6], "data": [1, 6, 11], "locat": [1, 6, 8], "i": [1, 2, 4, 5, 6, 7, 8, 9], "done": 1, "two": [1, 9], "step": 1, "first": [1, 8, 9], "respons": 1, "map": [1, 6], "from": [1, 6, 8, 9], "where": [1, 8, 9], "thei": 1, "should": [1, 8, 9, 11], "store": [1, 4], "memori": [1, 4, 6, 11], "Then": 1, "each": [1, 2, 5, 9, 11], "order": 1, "previous": 1, "assign": 1, "possibli": 1, "some": [1, 4, 5, 11], "befor": [1, 11], "after": 1, "concret": 1, "list": [1, 2, 5, 6, 8, 9, 11], "origin": 1, "The": [1, 5, 6, 8, 9, 11], "iter": [1, 2, 5], "over": [1, 2, 5], "handl": 1, "transpar": 1, "none": [1, 2, 5, 6, 8, 9], "old_instr": 1, "transform": 1, "an": [1, 2, 5, 8], "listcod": 1, "modifi": 1, "try": 1, "fail": 1, "ar": [1, 4, 6, 8, 9, 11], "more": 1, "than": [1, 6], "correspond": 1, "too": 1, "mani": 1, "itself": [2, 6], "its": [2, 6, 8, 11], "basic": [2, 11], "inst": 2, "made": 2, "three": [2, 9], "main": 2, "part": 2, "start": 2, "uniqu": [2, 4], "identifi": 2, "bodi": 2, "exclud": 2, "branch": [2, 6, 8, 9], "repres": [2, 11], "final": 2, "point": [2, 11], "successor": [2, 9], "see": [2, 5], "document": 2, "further": 2, "explan": 2, "str": [2, 4, 5, 6, 8], "output": [2, 5, 8, 9], "string": [2, 4, 6], "phi": [2, 11], "node": [2, 11], "nor": 2, "includ": 2, "except": [2, 3], "edg": 2, "consid": [2, 8], "term": 2, "set": [2, 8], "\u03c6": 2, "given": [2, 4, 5, 8, 9], "remov": 2, "f": [2, 5], "For": [2, 5], "real": [2, 5], "assum": 2, "instr": 2, "complet": [2, 5], "control": 2, "flow": 2, "graph": [2, 5], "mainli": 2, "indic": 2, "entri": 2, "exit": 2, "As": 2, "linear": [2, 5], "metadata": [2, 4], "about": [2, 11], "can": 2, "found": 2, "member": [2, 5], "variabl": [2, 4, 5], "blk": 2, "new": [2, 4, 5, 6, 8, 9], "predecessor": 2, "src": 2, "dest": 2, "dict": [2, 6, 8, 9], "ani": 2, "dictionari": 2, "associ": [2, 9], "contain": [2, 4, 5], "one": [2, 6, 8, 9], "definit": 2, "appli": 2, "procedur": 2, "everywher": 2, "lambda": 2, "print": [2, 5, 8, 9], "filenam": [2, 5], "df": [2, 5], "view": [2, 5], "fals": [2, 5, 9], "well": 4, "util": [4, 5, 8], "common": 4, "differ": [4, 6], "intermedi": 4, "represent": [4, 5], "div_by_zero": 4, "usual": 4, "indirectli": 4, "through": 4, "we": [4, 6, 11], "work": [4, 11], "which": [4, 6, 8], "ad": 4, "pool": [4, 6], "stack": 4, "decreas": 4, "rel": 4, "int": [4, 6], "current": 4, "cap": [5, 7, 9], "codegener": [5, 7], "api": [5, 7, 11], "program": 5, "repeatedli": 5, "codegen": 5, "visitor": 5, "build": [5, 6, 9], "meta": 5, "inform": 5, "instanc": 5, "debug": 5, "purpos": [5, 6], "allow": [5, 6, 11], "also": [5, 6], "relev": 5, "reg": 5, "integ": [5, 6], "valu": [5, 6, 8, 9], "newlin": 5, "expand": 5, "text": 5, "path": 5, "subclass": 6, "ha": 6, "address": [6, 8, 11], "constant": 6, "yet": 6, "shortcut": 6, "optyp": 6, "e": 6, "comparison": 6, "condjump": 6, "exampl": 6, "usag": 6, "beq": [6, 7], "equal": 6, "minicpars": [6, 7], "lt": 6, "lower": 6, "constructor": 6, "argument": [6, 11], "shall": 6, "all_op": 6, "oper": 6, "gt": 6, "kei": [6, 8, 9], "opdict": 6, "method": 6, "get": 6, "opposit": 6, "either": 6, "place": 6, "number": 6, "physic": 6, "cours": 6, "a2": 6, "a3": 6, "a4": 6, "a5": 6, "a6": 6, "a7": 6, "s1": 6, "s2": 6, "s3": 6, "s4": 6, "s5": 6, "s6": 6, "s7": 6, "s8": 6, "s9": 6, "s10": 6, "s11": 6, "t0": 6, "t1": 6, "t2": 6, "t3": 6, "t4": 6, "t5": 6, "t6": 6, "frame": 6, "pointer": 6, "save": 6, "0": 6, "usabl": 6, "basereg": 6, "comput": 6, "val": 6, "been": [6, 8, 9], "It": [6, 8], "later": 6, "manag": 6, "give": [6, 11], "must": 6, "other": [6, 8], "typic": 6, "type": [6, 9], "enforc": 6, "check": 6, "inde": 6, "bool": [6, 9], "true": [6, 8, 9], "mif08": [7, 9], "uncondit": 7, "wrapper": 7, "around": 7, "bge": 7, "bgt": 7, "c": 7, "like": 7, "eq": 7, "dr": 7, "sr1": 7, "sr2orimm7": 7, "And": 7, "cannot": 7, "due": 7, "python": [7, 11], "Or": 7, "imm7": 7, "sr": 7, "mem": 7, "asm": 8, "inherit": 8, "In": 8, "turn": 8, "regular": 8, "non": [8, 9, 11], "3": [8, 11], "registerset": 8, "pretti": 8, "written": 8, "read": 8, "subst": [8, 9], "tstatement": 8, "clone": [8, 9], "appear": [8, 9, 11], "new_arg": [8, 9], "have": [8, 9, 11], "stream": [8, 9], "never": [8, 9], "both": [8, 9], "onli": 8, "otherwis": 8, "destin": [8, 9], "take": [8, 9, 11], "absolut": 8, "specif": 8, "kind": [8, 9, 11], "j": [8, 9], "librari": 9, "end": [9, 11], "There": 9, "anoth": 9, "unlik": 9, "wa": 9, "specifi": 9, "mark": 9, "dure": 9, "construct": 9, "extract": 9, "chunk": 9, "second": 9, "alia": 9, "next_label": 9, "potenti": 9, "lib": [10, 11], "packag": 10, "submodul": 10, "modul": [10, 11], "content": 10, "risc": 11, "v": 11, "These": 11, "page": 11, "variou": 11, "folder": 11, "you": 11, "edit": 11, "them": 11, "assembli": 11, "won": 11, "creat": 11, "directli": 11, "veri": 11, "often": 11, "instead": 11, "easili": 11, "standard": 11, "pseudo": 11, "At": 11, "need": 11, "orient": 11, "those": 11, "present": 11, "model": 11, "lab": 11, "4a": 11, "understand": 11, "translat": 11, "make": 11, "domin": 11, "frontier": 11, "special": 11, "phinod": 11, "index": 11, "search": 11}, "objects": {"": [[0, 0, 0, "-", "Lib"]], "Lib": [[1, 0, 0, "-", "Allocator"], [2, 0, 0, "-", "CFG"], [3, 0, 0, "-", "Errors"], [4, 0, 0, "-", "FunctionData"], [5, 0, 0, "-", "LinearCode"], [6, 0, 0, "-", "Operands"], [7, 0, 0, "-", "RiscV"], [8, 0, 0, "-", "Statement"], [9, 0, 0, "-", "Terminator"]], "Lib.Allocator": [[1, 1, 1, "", "Allocator"], [1, 1, 1, "", "NaiveAllocator"]], "Lib.Allocator.Allocator": [[1, 2, 1, "", "prepare"], [1, 2, 1, "", "replace"], [1, 2, 1, "", "rewriteCode"]], "Lib.Allocator.NaiveAllocator": [[1, 2, 1, "", "prepare"], [1, 2, 1, "", "replace"]], "Lib.CFG": [[2, 1, 1, "", "Block"], [2, 1, 1, "", "CFG"]], "Lib.CFG.Block": [[2, 2, 1, "", "add_instruction"], [2, 2, 1, "", "add_phi"], [2, 2, 1, "", "get_all_statements"], [2, 2, 1, "", "get_body"], [2, 2, 1, "", "get_body_and_terminator"], [2, 2, 1, "", "get_in"], [2, 2, 1, "", "get_label"], [2, 2, 1, "", "get_phis"], [2, 2, 1, "", "get_terminator"], [2, 2, 1, "", "iter_statements"], [2, 2, 1, "", "remove_all_phis"], [2, 2, 1, "", "set_phis"], [2, 2, 1, "", "set_terminator"], [2, 2, 1, "", "to_dot"]], "Lib.CFG.CFG": [[2, 2, 1, "", "add_block"], [2, 2, 1, "", "add_edge"], [2, 3, 1, "", "fdata"], [2, 2, 1, "", "gather_defs"], [2, 2, 1, "", "get_block"], [2, 2, 1, "", "get_blocks"], [2, 2, 1, "", "get_end"], [2, 2, 1, "", "get_entries"], [2, 2, 1, "", "get_start"], [2, 2, 1, "", "iter_statements"], [2, 2, 1, "", "linearize_naive"], [2, 2, 1, "", "out_blocks"], [2, 2, 1, "", "print_code"], [2, 2, 1, "", "print_dot"], [2, 2, 1, "", "remove_edge"], [2, 2, 1, "", "set_start"]], "Lib.Errors": [[3, 4, 1, "", "AllocationError"], [3, 4, 1, "", "MiniCInternalError"], [3, 4, 1, "", "MiniCRuntimeError"], [3, 4, 1, "", "MiniCTypeError"], [3, 4, 1, "", "MiniCUnsupportedError"]], "Lib.FunctionData": [[4, 1, 1, "", "FunctionData"]], "Lib.FunctionData.FunctionData": [[4, 2, 1, "", "fresh_label"], [4, 2, 1, "", "fresh_offset"], [4, 2, 1, "", "fresh_tmp"], [4, 2, 1, "", "get_label_div_by_zero"], [4, 2, 1, "", "get_name"], [4, 2, 1, "", "get_offset"]], "Lib.LinearCode": [[5, 1, 1, "", "LinearCode"]], "Lib.LinearCode.LinearCode": [[5, 2, 1, "", "add_comment"], [5, 2, 1, "", "add_instruction"], [5, 2, 1, "", "add_instruction_PRINTLN_INT"], [5, 2, 1, "", "add_label"], [5, 3, 1, "", "fdata"], [5, 2, 1, "", "get_instructions"], [5, 2, 1, "", "iter_statements"], [5, 2, 1, "", "print_code"], [5, 2, 1, "", "print_dot"]], "Lib.Operands": [[6, 5, 1, "", "A"], [6, 5, 1, "", "A0"], [6, 5, 1, "", "A1"], [6, 1, 1, "", "Condition"], [6, 1, 1, "", "DataLocation"], [6, 5, 1, "", "FP"], [6, 1, 1, "", "Function"], [6, 5, 1, "", "GP"], [6, 5, 1, "", "GP_REGS"], [6, 1, 1, "", "Immediate"], [6, 1, 1, "", "Offset"], [6, 1, 1, "", "Operand"], [6, 5, 1, "", "RA"], [6, 1, 1, "", "Register"], [6, 1, 1, "", "Renamer"], [6, 5, 1, "", "S"], [6, 5, 1, "", "SP"], [6, 5, 1, "", "T"], [6, 5, 1, "", "TP"], [6, 1, 1, "", "Temporary"], [6, 1, 1, "", "TemporaryPool"], [6, 5, 1, "", "ZERO"]], "Lib.Operands.Condition": [[6, 2, 1, "", "negate"]], "Lib.Operands.Offset": [[6, 2, 1, "", "get_offset"]], "Lib.Operands.Renamer": [[6, 2, 1, "", "copy"], [6, 2, 1, "", "defined"], [6, 2, 1, "", "fresh"], [6, 2, 1, "", "replace"]], "Lib.Operands.Temporary": [[6, 2, 1, "", "get_alloced_loc"]], "Lib.Operands.TemporaryPool": [[6, 2, 1, "", "add_tmp"], [6, 2, 1, "", "fresh_tmp"], [6, 2, 1, "", "get_all_temps"], [6, 2, 1, "", "get_alloced_loc"], [6, 2, 1, "", "set_temp_allocation"]], "Lib.RiscV": [[7, 6, 1, "", "add"], [7, 6, 1, "", "call"], [7, 6, 1, "", "conditional_jump"], [7, 6, 1, "", "div"], [7, 6, 1, "", "jump"], [7, 6, 1, "", "land"], [7, 6, 1, "", "ld"], [7, 6, 1, "", "li"], [7, 6, 1, "", "lor"], [7, 6, 1, "", "mul"], [7, 6, 1, "", "mv"], [7, 6, 1, "", "rem"], [7, 6, 1, "", "sd"], [7, 6, 1, "", "sub"], [7, 6, 1, "", "xor"]], "Lib.Statement": [[8, 1, 1, "", "AbsoluteJump"], [8, 1, 1, "", "Comment"], [8, 1, 1, "", "ConditionalJump"], [8, 1, 1, "", "Instru3A"], [8, 1, 1, "", "Instruction"], [8, 1, 1, "", "Label"], [8, 1, 1, "", "Statement"], [8, 6, 1, "", "regset_to_string"]], "Lib.Statement.AbsoluteJump": [[8, 2, 1, "", "args"], [8, 3, 1, "", "ins"], [8, 3, 1, "", "label"], [8, 2, 1, "", "rename"], [8, 2, 1, "", "substitute"], [8, 2, 1, "", "targets"], [8, 2, 1, "", "with_args"]], "Lib.Statement.Comment": [[8, 3, 1, "", "comment"], [8, 2, 1, "", "printIns"]], "Lib.Statement.ConditionalJump": [[8, 2, 1, "", "args"], [8, 3, 1, "", "cond"], [8, 3, 1, "", "label"], [8, 3, 1, "", "op1"], [8, 3, 1, "", "op2"], [8, 2, 1, "", "rename"], [8, 2, 1, "", "substitute"], [8, 2, 1, "", "with_args"]], "Lib.Statement.Instru3A": [[8, 2, 1, "", "args"], [8, 2, 1, "", "rename"], [8, 2, 1, "", "substitute"], [8, 2, 1, "", "with_args"]], "Lib.Statement.Instruction": [[8, 2, 1, "", "args"], [8, 2, 1, "", "defined"], [8, 3, 1, "", "ins"], [8, 2, 1, "", "is_read_only"], [8, 2, 1, "", "printIns"], [8, 2, 1, "", "rename"], [8, 2, 1, "", "used"]], "Lib.Statement.Label": [[8, 3, 1, "", "name"], [8, 2, 1, "", "printIns"]], "Lib.Statement.Statement": [[8, 2, 1, "", "defined"], [8, 2, 1, "", "printIns"], [8, 2, 1, "", "substitute"], [8, 2, 1, "", "used"], [8, 2, 1, "", "with_args"]], "Lib.Terminator": [[9, 1, 1, "", "BranchingTerminator"], [9, 1, 1, "", "Return"], [9, 5, 1, "", "Terminator"], [9, 6, 1, "", "jump2terminator"]], "Lib.Terminator.BranchingTerminator": [[9, 2, 1, "", "args"], [9, 3, 1, "", "cond"], [9, 3, 1, "", "label_else"], [9, 3, 1, "", "label_then"], [9, 3, 1, "", "op1"], [9, 3, 1, "", "op2"], [9, 2, 1, "", "rename"], [9, 2, 1, "", "substitute"], [9, 2, 1, "", "targets"], [9, 2, 1, "", "with_args"]], "Lib.Terminator.Return": [[9, 2, 1, "", "args"], [9, 2, 1, "", "is_read_only"], [9, 2, 1, "", "printIns"], [9, 2, 1, "", "rename"], [9, 2, 1, "", "substitute"], [9, 2, 1, "", "targets"], [9, 2, 1, "", "with_args"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:exception", "5": "py:data", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "exception", "Python exception"], "5": ["py", "data", "Python data"], "6": ["py", "function", "Python function"]}, "titleterms": {"lib": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "packag": 0, "submodul": 0, "modul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "content": [0, 11], "alloc": [1, 11], "cfg": 2, "error": 3, "functiondata": 4, "linearcod": 5, "operand": 6, "riscv": 7, "statement": 8, "termin": 9, "minic": [10, 11], "welcom": 11, "": 11, "document": 11, "base": 11, "librari": 11, "linear": 11, "intermedi": 11, "represent": 11, "temporari": 11, "control": 11, "flow": 11, "graph": 11, "ssa": 11, "form": 11, "indic": 11, "tabl": 11}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"Lib package": [[0, "lib-package"]], "Submodules": [[0, "submodules"]], "Module contents": [[0, "module-Lib"]], "Lib.Allocator module": [[1, "module-Lib.Allocator"]], "Lib.CFG module": [[2, "module-Lib.CFG"]], "Lib.Errors module": [[3, "module-Lib.Errors"]], "Lib.FunctionData module": [[4, "module-Lib.FunctionData"]], "Lib.LinearCode module": [[5, "module-Lib.LinearCode"]], "Lib.Operands module": [[6, "module-Lib.Operands"]], "Lib.RiscV module": [[7, "module-Lib.RiscV"]], "Lib.Statement module": [[8, "module-Lib.Statement"]], "Lib.Terminator module": [[9, "module-Lib.Terminator"]], "MiniC": [[10, "minic"]], "Welcome to MiniC\u2019s documentation!": [[11, "welcome-to-minic-s-documentation"]], "Contents:": [[11, null]], "Base library": [[11, "base-library"]], "Linear Intermediate representation": [[11, "linear-intermediate-representation"]], "Temporary allocation": [[11, "temporary-allocation"]], "Control Flow Graph Intermediate representation": [[11, "control-flow-graph-intermediate-representation"]], "SSA form": [[11, "ssa-form"]], "Indices and tables": [[11, "indices-and-tables"]]}, "indexentries": {"lib": [[0, "module-Lib"]], "module": [[0, "module-Lib"], [1, "module-Lib.Allocator"], [2, "module-Lib.CFG"], [3, "module-Lib.Errors"], [4, "module-Lib.FunctionData"], [5, "module-Lib.LinearCode"], [6, "module-Lib.Operands"], [7, "module-Lib.RiscV"], [8, "module-Lib.Statement"], [9, "module-Lib.Terminator"]], "allocator (class in lib.allocator)": [[1, "Lib.Allocator.Allocator"]], "lib.allocator": [[1, "module-Lib.Allocator"]], "naiveallocator (class in lib.allocator)": [[1, "Lib.Allocator.NaiveAllocator"]], "prepare() (lib.allocator.allocator method)": [[1, "Lib.Allocator.Allocator.prepare"]], "prepare() (lib.allocator.naiveallocator method)": [[1, "Lib.Allocator.NaiveAllocator.prepare"]], "replace() (lib.allocator.allocator method)": [[1, "Lib.Allocator.Allocator.replace"]], "replace() (lib.allocator.naiveallocator method)": [[1, "Lib.Allocator.NaiveAllocator.replace"]], "rewritecode() (lib.allocator.allocator method)": [[1, "Lib.Allocator.Allocator.rewriteCode"]], "block (class in lib.cfg)": [[2, "Lib.CFG.Block"]], "cfg (class in lib.cfg)": [[2, "Lib.CFG.CFG"]], "lib.cfg": [[2, "module-Lib.CFG"]], "add_block() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.add_block"]], "add_edge() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.add_edge"]], "add_instruction() (lib.cfg.block method)": [[2, "Lib.CFG.Block.add_instruction"]], "add_phi() (lib.cfg.block method)": [[2, "Lib.CFG.Block.add_phi"]], "fdata (lib.cfg.cfg attribute)": [[2, "Lib.CFG.CFG.fdata"]], "gather_defs() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.gather_defs"]], "get_all_statements() (lib.cfg.block method)": [[2, "Lib.CFG.Block.get_all_statements"]], "get_block() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.get_block"]], "get_blocks() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.get_blocks"]], "get_body() (lib.cfg.block method)": [[2, "Lib.CFG.Block.get_body"]], "get_body_and_terminator() (lib.cfg.block method)": [[2, "Lib.CFG.Block.get_body_and_terminator"]], "get_end() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.get_end"]], "get_entries() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.get_entries"]], "get_in() (lib.cfg.block method)": [[2, "Lib.CFG.Block.get_in"]], "get_label() (lib.cfg.block method)": [[2, "Lib.CFG.Block.get_label"]], "get_phis() (lib.cfg.block method)": [[2, "Lib.CFG.Block.get_phis"]], "get_start() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.get_start"]], "get_terminator() (lib.cfg.block method)": [[2, "Lib.CFG.Block.get_terminator"]], "iter_statements() (lib.cfg.block method)": [[2, "Lib.CFG.Block.iter_statements"]], "iter_statements() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.iter_statements"]], "linearize_naive() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.linearize_naive"]], "out_blocks() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.out_blocks"]], "print_code() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.print_code"]], "print_dot() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.print_dot"]], "remove_all_phis() (lib.cfg.block method)": [[2, "Lib.CFG.Block.remove_all_phis"]], "remove_edge() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.remove_edge"]], "set_phis() (lib.cfg.block method)": [[2, "Lib.CFG.Block.set_phis"]], "set_start() (lib.cfg.cfg method)": [[2, "Lib.CFG.CFG.set_start"]], "set_terminator() (lib.cfg.block method)": [[2, "Lib.CFG.Block.set_terminator"]], "to_dot() (lib.cfg.block method)": [[2, "Lib.CFG.Block.to_dot"]], "allocationerror": [[3, "Lib.Errors.AllocationError"]], "lib.errors": [[3, "module-Lib.Errors"]], "minicinternalerror": [[3, "Lib.Errors.MiniCInternalError"]], "minicruntimeerror": [[3, "Lib.Errors.MiniCRuntimeError"]], "minictypeerror": [[3, "Lib.Errors.MiniCTypeError"]], "minicunsupportederror": [[3, "Lib.Errors.MiniCUnsupportedError"]], "functiondata (class in lib.functiondata)": [[4, "Lib.FunctionData.FunctionData"]], "lib.functiondata": [[4, "module-Lib.FunctionData"]], "fresh_label() (lib.functiondata.functiondata method)": [[4, "Lib.FunctionData.FunctionData.fresh_label"]], "fresh_offset() (lib.functiondata.functiondata method)": [[4, "Lib.FunctionData.FunctionData.fresh_offset"]], "fresh_tmp() (lib.functiondata.functiondata method)": [[4, "Lib.FunctionData.FunctionData.fresh_tmp"]], "get_label_div_by_zero() (lib.functiondata.functiondata method)": [[4, "Lib.FunctionData.FunctionData.get_label_div_by_zero"]], "get_name() (lib.functiondata.functiondata method)": [[4, "Lib.FunctionData.FunctionData.get_name"]], "get_offset() (lib.functiondata.functiondata method)": [[4, "Lib.FunctionData.FunctionData.get_offset"]], "lib.linearcode": [[5, "module-Lib.LinearCode"]], "linearcode (class in lib.linearcode)": [[5, "Lib.LinearCode.LinearCode"]], "add_comment() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.add_comment"]], "add_instruction() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.add_instruction"]], "add_instruction_println_int() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.add_instruction_PRINTLN_INT"]], "add_label() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.add_label"]], "fdata (lib.linearcode.linearcode attribute)": [[5, "Lib.LinearCode.LinearCode.fdata"]], "get_instructions() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.get_instructions"]], "iter_statements() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.iter_statements"]], "print_code() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.print_code"]], "print_dot() (lib.linearcode.linearcode method)": [[5, "Lib.LinearCode.LinearCode.print_dot"]], "a (in module lib.operands)": [[6, "Lib.Operands.A"]], "a0 (in module lib.operands)": [[6, "Lib.Operands.A0"]], "a1 (in module lib.operands)": [[6, "Lib.Operands.A1"]], "condition (class in lib.operands)": [[6, "Lib.Operands.Condition"]], "datalocation (class in lib.operands)": [[6, "Lib.Operands.DataLocation"]], "fp (in module lib.operands)": [[6, "Lib.Operands.FP"]], "function (class in lib.operands)": [[6, "Lib.Operands.Function"]], "gp (in module lib.operands)": [[6, "Lib.Operands.GP"]], "gp_regs (in module lib.operands)": [[6, "Lib.Operands.GP_REGS"]], "immediate (class in lib.operands)": [[6, "Lib.Operands.Immediate"]], "lib.operands": [[6, "module-Lib.Operands"]], "offset (class in lib.operands)": [[6, "Lib.Operands.Offset"]], "operand (class in lib.operands)": [[6, "Lib.Operands.Operand"]], "ra (in module lib.operands)": [[6, "Lib.Operands.RA"]], "register (class in lib.operands)": [[6, "Lib.Operands.Register"]], "renamer (class in lib.operands)": [[6, "Lib.Operands.Renamer"]], "s (in module lib.operands)": [[6, "Lib.Operands.S"]], "sp (in module lib.operands)": [[6, "Lib.Operands.SP"]], "t (in module lib.operands)": [[6, "Lib.Operands.T"]], "tp (in module lib.operands)": [[6, "Lib.Operands.TP"]], "temporary (class in lib.operands)": [[6, "Lib.Operands.Temporary"]], "temporarypool (class in lib.operands)": [[6, "Lib.Operands.TemporaryPool"]], "zero (in module lib.operands)": [[6, "Lib.Operands.ZERO"]], "add_tmp() (lib.operands.temporarypool method)": [[6, "Lib.Operands.TemporaryPool.add_tmp"]], "copy() (lib.operands.renamer method)": [[6, "Lib.Operands.Renamer.copy"]], "defined() (lib.operands.renamer method)": [[6, "Lib.Operands.Renamer.defined"]], "fresh() (lib.operands.renamer method)": [[6, "Lib.Operands.Renamer.fresh"]], "fresh_tmp() (lib.operands.temporarypool method)": [[6, "Lib.Operands.TemporaryPool.fresh_tmp"]], "get_all_temps() (lib.operands.temporarypool method)": [[6, "Lib.Operands.TemporaryPool.get_all_temps"]], "get_alloced_loc() (lib.operands.temporary method)": [[6, "Lib.Operands.Temporary.get_alloced_loc"]], "get_alloced_loc() (lib.operands.temporarypool method)": [[6, "Lib.Operands.TemporaryPool.get_alloced_loc"]], "get_offset() (lib.operands.offset method)": [[6, "Lib.Operands.Offset.get_offset"]], "negate() (lib.operands.condition method)": [[6, "Lib.Operands.Condition.negate"]], "replace() (lib.operands.renamer method)": [[6, "Lib.Operands.Renamer.replace"]], "set_temp_allocation() (lib.operands.temporarypool method)": [[6, "Lib.Operands.TemporaryPool.set_temp_allocation"]], "lib.riscv": [[7, "module-Lib.RiscV"]], "add() (in module lib.riscv)": [[7, "Lib.RiscV.add"]], "call() (in module lib.riscv)": [[7, "Lib.RiscV.call"]], "conditional_jump() (in module lib.riscv)": [[7, "Lib.RiscV.conditional_jump"]], "div() (in module lib.riscv)": [[7, "Lib.RiscV.div"]], "jump() (in module lib.riscv)": [[7, "Lib.RiscV.jump"]], "land() (in module lib.riscv)": [[7, "Lib.RiscV.land"]], "ld() (in module lib.riscv)": [[7, "Lib.RiscV.ld"]], "li() (in module lib.riscv)": [[7, "Lib.RiscV.li"]], "lor() (in module lib.riscv)": [[7, "Lib.RiscV.lor"]], "mul() (in module lib.riscv)": [[7, "Lib.RiscV.mul"]], "mv() (in module lib.riscv)": [[7, "Lib.RiscV.mv"]], "rem() (in module lib.riscv)": [[7, "Lib.RiscV.rem"]], "sd() (in module lib.riscv)": [[7, "Lib.RiscV.sd"]], "sub() (in module lib.riscv)": [[7, "Lib.RiscV.sub"]], "xor() (in module lib.riscv)": [[7, "Lib.RiscV.xor"]], "absolutejump (class in lib.statement)": [[8, "Lib.Statement.AbsoluteJump"]], "comment (class in lib.statement)": [[8, "Lib.Statement.Comment"]], "conditionaljump (class in lib.statement)": [[8, "Lib.Statement.ConditionalJump"]], "instru3a (class in lib.statement)": [[8, "Lib.Statement.Instru3A"]], "instruction (class in lib.statement)": [[8, "Lib.Statement.Instruction"]], "label (class in lib.statement)": [[8, "Lib.Statement.Label"]], "lib.statement": [[8, "module-Lib.Statement"]], "statement (class in lib.statement)": [[8, "Lib.Statement.Statement"]], "args() (lib.statement.absolutejump method)": [[8, "Lib.Statement.AbsoluteJump.args"]], "args() (lib.statement.conditionaljump method)": [[8, "Lib.Statement.ConditionalJump.args"]], "args() (lib.statement.instru3a method)": [[8, "Lib.Statement.Instru3A.args"]], "args() (lib.statement.instruction method)": [[8, "Lib.Statement.Instruction.args"]], "comment (lib.statement.comment attribute)": [[8, "Lib.Statement.Comment.comment"]], "cond (lib.statement.conditionaljump attribute)": [[8, "Lib.Statement.ConditionalJump.cond"]], "defined() (lib.statement.instruction method)": [[8, "Lib.Statement.Instruction.defined"]], "defined() (lib.statement.statement method)": [[8, "Lib.Statement.Statement.defined"]], "ins (lib.statement.absolutejump attribute)": [[8, "Lib.Statement.AbsoluteJump.ins"]], "ins (lib.statement.instruction attribute)": [[8, "Lib.Statement.Instruction.ins"]], "is_read_only() (lib.statement.instruction method)": [[8, "Lib.Statement.Instruction.is_read_only"]], "label (lib.statement.absolutejump attribute)": [[8, "Lib.Statement.AbsoluteJump.label"]], "label (lib.statement.conditionaljump attribute)": [[8, "Lib.Statement.ConditionalJump.label"]], "name (lib.statement.label attribute)": [[8, "Lib.Statement.Label.name"]], "op1 (lib.statement.conditionaljump attribute)": [[8, "Lib.Statement.ConditionalJump.op1"]], "op2 (lib.statement.conditionaljump attribute)": [[8, "Lib.Statement.ConditionalJump.op2"]], "printins() (lib.statement.comment method)": [[8, "Lib.Statement.Comment.printIns"]], "printins() (lib.statement.instruction method)": [[8, "Lib.Statement.Instruction.printIns"]], "printins() (lib.statement.label method)": [[8, "Lib.Statement.Label.printIns"]], "printins() (lib.statement.statement method)": [[8, "Lib.Statement.Statement.printIns"]], "regset_to_string() (in module lib.statement)": [[8, "Lib.Statement.regset_to_string"]], "rename() (lib.statement.absolutejump method)": [[8, "Lib.Statement.AbsoluteJump.rename"]], "rename() (lib.statement.conditionaljump method)": [[8, "Lib.Statement.ConditionalJump.rename"]], "rename() (lib.statement.instru3a method)": [[8, "Lib.Statement.Instru3A.rename"]], "rename() (lib.statement.instruction method)": [[8, "Lib.Statement.Instruction.rename"]], "substitute() (lib.statement.absolutejump method)": [[8, "Lib.Statement.AbsoluteJump.substitute"]], "substitute() (lib.statement.conditionaljump method)": [[8, "Lib.Statement.ConditionalJump.substitute"]], "substitute() (lib.statement.instru3a method)": [[8, "Lib.Statement.Instru3A.substitute"]], "substitute() (lib.statement.statement method)": [[8, "Lib.Statement.Statement.substitute"]], "targets() (lib.statement.absolutejump method)": [[8, "Lib.Statement.AbsoluteJump.targets"]], "used() (lib.statement.instruction method)": [[8, "Lib.Statement.Instruction.used"]], "used() (lib.statement.statement method)": [[8, "Lib.Statement.Statement.used"]], "with_args() (lib.statement.absolutejump method)": [[8, "Lib.Statement.AbsoluteJump.with_args"]], "with_args() (lib.statement.conditionaljump method)": [[8, "Lib.Statement.ConditionalJump.with_args"]], "with_args() (lib.statement.instru3a method)": [[8, "Lib.Statement.Instru3A.with_args"]], "with_args() (lib.statement.statement method)": [[8, "Lib.Statement.Statement.with_args"]], "branchingterminator (class in lib.terminator)": [[9, "Lib.Terminator.BranchingTerminator"]], "lib.terminator": [[9, "module-Lib.Terminator"]], "return (class in lib.terminator)": [[9, "Lib.Terminator.Return"]], "terminator (in module lib.terminator)": [[9, "Lib.Terminator.Terminator"]], "args() (lib.terminator.branchingterminator method)": [[9, "Lib.Terminator.BranchingTerminator.args"]], "args() (lib.terminator.return method)": [[9, "Lib.Terminator.Return.args"]], "cond (lib.terminator.branchingterminator attribute)": [[9, "Lib.Terminator.BranchingTerminator.cond"]], "is_read_only() (lib.terminator.return method)": [[9, "Lib.Terminator.Return.is_read_only"]], "jump2terminator() (in module lib.terminator)": [[9, "Lib.Terminator.jump2terminator"]], "label_else (lib.terminator.branchingterminator attribute)": [[9, "Lib.Terminator.BranchingTerminator.label_else"]], "label_then (lib.terminator.branchingterminator attribute)": [[9, "Lib.Terminator.BranchingTerminator.label_then"]], "op1 (lib.terminator.branchingterminator attribute)": [[9, "Lib.Terminator.BranchingTerminator.op1"]], "op2 (lib.terminator.branchingterminator attribute)": [[9, "Lib.Terminator.BranchingTerminator.op2"]], "printins() (lib.terminator.return method)": [[9, "Lib.Terminator.Return.printIns"]], "rename() (lib.terminator.branchingterminator method)": [[9, "Lib.Terminator.BranchingTerminator.rename"]], "rename() (lib.terminator.return method)": [[9, "Lib.Terminator.Return.rename"]], "substitute() (lib.terminator.branchingterminator method)": [[9, "Lib.Terminator.BranchingTerminator.substitute"]], "substitute() (lib.terminator.return method)": [[9, "Lib.Terminator.Return.substitute"]], "targets() (lib.terminator.branchingterminator method)": [[9, "Lib.Terminator.BranchingTerminator.targets"]], "targets() (lib.terminator.return method)": [[9, "Lib.Terminator.Return.targets"]], "with_args() (lib.terminator.branchingterminator method)": [[9, "Lib.Terminator.BranchingTerminator.with_args"]], "with_args() (lib.terminator.return method)": [[9, "Lib.Terminator.Return.with_args"]]}}) \ No newline at end of file

    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 Zm8Z8qW&}zI0%F8qK!h9|N}4dj{{Base library - Function data