-
Notifications
You must be signed in to change notification settings - Fork 0
/
459211010.html
144 lines (129 loc) · 28.2 KB
/
459211010.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<!DOCTYPE html>
<html>
<head>
<title>Di Luo : Di Luo's CS232 Project 8</title>
<link rel="stylesheet" href="styles/site.css" type="text/css" />
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body class="theme-default aui-theme-default">
<div id="page">
<div id="main" class="aui-page-panel">
<div id="main-header">
<div id="breadcrumb-section">
<ol id="breadcrumbs">
<li class="first">
<span><a href="index.html">Di Luo</a></span>
</li>
<li>
<span><a href="413631037.html">Di Luo’s Home</a></span>
</li>
<li>
<span><a href="474513832.html">Di Luo's CS232</a></span>
</li>
</ol>
</div>
<h1 id="title-heading" class="pagetitle">
<span id="title-text">
Di Luo : Di Luo's CS232 Project 8
</span>
</h1>
</div>
<div id="content" class="view">
<div class="page-metadata">
Created by <span class='author'> Di Luo</span>, last modified on Nov 22, 2019
</div>
<div id="main-content" class="wiki-content group">
<p><u><strong>Summary</strong></u></p><p>The purpose of the project is to <span style="color: rgb(34,51,68);">create the assembler in python that </span><span style="color: rgb(34,51,68);">converts a set of instructions written in a simple mnemonic language (which is human-readable) into machine code appropriate for loading onto </span><span style="color: rgb(34,51,68);">the CPU built in project 7. (To check each program, please change the name of mif file indicated in ProgramROM.vhd)</span></p><p> </p><p><u><strong>Main Task</strong></u></p><p>Based on the templated offered by Bruce, the assembler was created in assembler.py, which contains the following functions: dec2comp8() converts d to an 8-bit 2-s complement binary value. dec2bin8() converts d to an 8-bit unsigned binary value. tokenize() tokenizes the input data, discarding white space and comments, and returns the tokens as a list of lists, one list for each line. The tokenizer also converts each character to lower case. The previews functions were offered by Bruce in the template. Then I implemented two functions, pass1 and pass2, which do the work described as follow:</p><p>pass 1: read through the instructions and put numbers on each instruction location and calculate the label values (read through the file and return a dictionary of all location labels as keys and its line number as values)<br/>pass 2: read through the instructions and build the machine instructions (take in the tokens and the label dictionary and generate the set of machine instructions)</p><p>Then in the main function, the assembler reads in the file indicated by command line variable, tokenizes it, call pass1 on the tokens to get the dictionary for labels and remove labels from tokens, then call pass2 on the tokens and label dictionary to generate the list of instructions. Then the code for mif file would be printed in terminal and it can be transfered to a new mif file by copying and pasting. (Extension 1 enables assembler to directly create the mif file.)</p><p>In testing process, I firstly tested with the two file offered in assembly language description page, which are testa.txt and sumten.txt, and the output mif files were the same as the correct answers.</p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342129.png" data-image-src="attachments/459211010/459342129.png" data-unresolved-comment-count="0" data-linked-resource-id="459342129" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 9.34.00 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342130.png" data-image-src="attachments/459211010/459342130.png" data-unresolved-comment-count="0" data-linked-resource-id="459342130" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 9.35.53 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p>Then I wrote the Fibonacci program created in last project with assembly language shown in fib.txt on the left. The mif file codes were created on posted on the terminal and I created the new mif file with the code. The program uses a loop to iteratively increment RA and RB with Fibonacci numbers and uses RC to represent the output. The testing result correctly presents the Fibonacci numbers: 1: 0x0001, 2: 0x0002, ... , 55: 0x0037.</p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="310" src="attachments/459211010/459342104.png" data-image-src="attachments/459211010/459342104.png" data-unresolved-comment-count="0" data-linked-resource-id="459342104" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 10.44.57 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342103.png" data-image-src="attachments/459211010/459342103.png" data-unresolved-comment-count="0" data-linked-resource-id="459342103" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 8.50.44 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342105.png" data-image-src="attachments/459211010/459342105.png" data-unresolved-comment-count="0" data-linked-resource-id="459342105" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 10.45.04 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="500" src="attachments/459211010/459342099.png" data-image-src="attachments/459211010/459342099.png" data-unresolved-comment-count="0" data-linked-resource-id="459342099" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="fibtestGTK.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p>Then I wrote a recursive program in recursive.txt that sums numbers from 1 to N in assembly. In this case I have N = 10 and the correct result should be 55 or 0x0037. The mif file on the right was created with the assembly file. This program used CALL and RETURN, in which the function SUM was called recursively to increment RB with incrementer RC=1 and add RB to RA, which is the return value. The result correctly presents the values: 1,3,6,10,15 ... 55.</p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342106.png" data-image-src="attachments/459211010/459342106.png" data-unresolved-comment-count="0" data-linked-resource-id="459342106" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 10.44.47 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342107.png" data-image-src="attachments/459211010/459342107.png" data-unresolved-comment-count="0" data-linked-resource-id="459342107" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 10.44.35 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="500" src="attachments/459211010/459342100.png" data-image-src="attachments/459211010/459342100.png" data-unresolved-comment-count="0" data-linked-resource-id="459342100" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="recursivegtktest.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p><u><strong>Extension</strong></u></p><p><strong>Extension 1:</strong> Generate an MIF directly in assembler.py</p><p><span style="color: rgb(34,51,68);">I improved main function of assembler.py so that it can directly generate an MIF file for the ROM that can be read by Quartus when compiling your CPU instead of printing the instructions in terminal and moving them to MIF manually.</span></p><p><span style="color: rgb(34,51,68);"><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342103.png" data-image-src="attachments/459211010/459342103.png" data-unresolved-comment-count="0" data-linked-resource-id="459342103" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 8.50.44 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></span></p><p><span style="color: rgb(34,51,68);"><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342105.png" data-image-src="attachments/459211010/459342105.png" data-unresolved-comment-count="0" data-linked-resource-id="459342105" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 10.45.04 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></span></p><p><strong>Extension 2:</strong> Demonstrate your programs, generated by your assembler, on the board</p><p>I tested the Fibonacci program and recursive program on the board, which correctly shows the result.</p><p>Fib:</p><p><div class="embeddedObject" >
<video src="/download/attachments/459211010/IMG_2333.MOV" height="380" width="480" controls>
Your browser does not support the HTML5 video element
</video>
</div>
</p><p> </p><p>Recursive</p><p><div class="embeddedObject" >
<video src="/download/attachments/459211010/IMG_2334.MOV" height="380" width="480" controls>
Your browser does not support the HTML5 video element
</video>
</div>
</p><p> </p><p><strong>Extension 3:</strong> <span style="color: rgb(34,51,68);">Make your assembler more intelligent so that it can catch errors, tell the user what the error is, and possibly suggest corrections</span></p><p><span style="color: rgb(34,51,68);"><span style="">My assembler can check whether the instruction is valid. If not, the error would be notified and correct instructions would be printed.</span></span></p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342119.png" data-image-src="attachments/459211010/459342119.png" data-unresolved-comment-count="0" data-linked-resource-id="459342119" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 9.56.22 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p>If the instruction is missing a variable (register), the assembler would notify the user that wrong register number exist in specific line.</p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342120.png" data-image-src="attachments/459211010/459342120.png" data-unresolved-comment-count="0" data-linked-resource-id="459342120" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 9.57.14 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p>If the label duplicates, the assembler would notify.</p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342121.png" data-image-src="attachments/459211010/459342121.png" data-unresolved-comment-count="0" data-linked-resource-id="459342121" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 9.58.30 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p>If the label is wrongly used, the assembler would notify.</p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342122.png" data-image-src="attachments/459211010/459342122.png" data-unresolved-comment-count="0" data-linked-resource-id="459342122" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 10.01.52 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p>Some other error checkers were used, which help users to see the problems in assembly code.</p><p><strong><br/></strong></p><p><strong>Extension 4:</strong> <span style="color: rgb(34,51,68);">Create some test programs that evaluate all of the CPUs capabilities</span></p><p><span style="color: rgb(34,51,68);">I created teststack.txt to test the stack (push and pop) and testalu.txt to test alu instrucitons (add, sub, and, or, xor, shift, rotate).</span></p><p><span style="color: rgb(34,51,68);"><span style="">teststack.txt has RA=1, RB=2, RC=3 initially and push RA, RB, RC onto the stack, then reverse the values by poping to RC, RB, RA. The result shows that stack functionality is valid.</span></span></p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342125.png" data-image-src="attachments/459211010/459342125.png" data-unresolved-comment-count="0" data-linked-resource-id="459342125" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 11.03.33 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342126.png" data-image-src="attachments/459211010/459342126.png" data-unresolved-comment-count="0" data-linked-resource-id="459342126" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 11.03.24 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="500" src="attachments/459211010/459342098.png" data-image-src="attachments/459211010/459342098.png" data-unresolved-comment-count="0" data-linked-resource-id="459342098" data-linked-resource-version="2" data-linked-resource-type="attachment" data-linked-resource-default-alias="teststack.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p>testalu.txt has RA=1, RB=2, RC=3. RD shows the result of different operations. The result shows that all alu operations are correct. 1+2=3, 3-3=0, 1 and 2 = 0, 1 or 2 = 3, 1 xor 3 = 2, shiftl 3 = 6, shiftr 3 = 1, rotl 3 = 6, rotr 3 = 0x8001.</p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342127.png" data-image-src="attachments/459211010/459342127.png" data-unresolved-comment-count="0" data-linked-resource-id="459342127" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-22 at 1.35.11 AM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="301" src="attachments/459211010/459342128.png" data-image-src="attachments/459211010/459342128.png" data-unresolved-comment-count="0" data-linked-resource-id="459342128" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Screen Shot 2019-11-21 at 11.03.20 PM.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image" draggable="false" width="500" src="attachments/459211010/459342102.png" data-image-src="attachments/459211010/459342102.png" data-unresolved-comment-count="0" data-linked-resource-id="459342102" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="testalu.png" data-base-url="https://wiki.colby.edu" data-linked-resource-content-type="image/png" data-linked-resource-container-id="459211010" data-linked-resource-container-version="5"></span></p><p> </p><p><u><strong>Acknowledgment</strong></u></p><p>Student: Yixuan Qiu</p>
</div>
<div class="pageSection group">
<div class="pageSectionHeader">
<h2 id="attachments" class="pageSectionTitle">Attachments:</h2>
</div>
<div class="greybox" align="left">
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342101.png">teststack.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342099.png">fibtestGTK.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342100.png">recursivegtktest.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342098.png">teststack.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342102.png">testalu.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342103.png">Screen Shot 2019-11-21 at 8.50.44 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342104.png">Screen Shot 2019-11-21 at 10.44.57 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342105.png">Screen Shot 2019-11-21 at 10.45.04 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342106.png">Screen Shot 2019-11-21 at 10.44.47 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342107.png">Screen Shot 2019-11-21 at 10.44.35 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342119.png">Screen Shot 2019-11-21 at 9.56.22 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342120.png">Screen Shot 2019-11-21 at 9.57.14 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342121.png">Screen Shot 2019-11-21 at 9.58.30 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342122.png">Screen Shot 2019-11-21 at 10.01.52 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342125.png">Screen Shot 2019-11-21 at 11.03.33 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342126.png">Screen Shot 2019-11-21 at 11.03.24 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342127.png">Screen Shot 2019-11-22 at 1.35.11 AM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342128.png">Screen Shot 2019-11-21 at 11.03.20 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342129.png">Screen Shot 2019-11-21 at 9.34.00 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342130.png">Screen Shot 2019-11-21 at 9.35.53 PM.png</a> (image/png)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342131.mov">IMG_2333.MOV</a> (video/quicktime)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/459211010/459342132.mov">IMG_2334.MOV</a> (video/quicktime)
<br/>
</div>
</div>
</div> </div>
<div id="footer" role="contentinfo">
<section class="footer-body">
<p>Document generated by Confluence on Aug 29, 2022 09:29</p>
<div id="footer-logo"><a href="http://www.atlassian.com/">Atlassian</a></div>
</section>
</div>
</div> </body>
</html>