split doc

This commit is contained in:
yaozhicheng 2024-04-11 16:15:54 +08:00
parent e2f6f52da9
commit db4a27389b
6 changed files with 398 additions and 182 deletions

188
Readme.md
View File

@ -1,190 +1,14 @@
# 香山微架构开放验证第一期昆明湖BPU模块UT验证实战
# The first phase of Open Verification for the Kunminghu microarchitecture of Xiangshan: Kunminghu's BPU Module UT Verification in Action.
本仓库为“香山微架构开放验证第一期昆明湖BPU模块UT验证实战”的验证环境。该验证环境需要在linux系统下运行它包含了如何生成带验证的Python DUT模块、验证示例、验证报告生成等模块。待验证模块对应的香山仓库为[github.com/OpenXiangShan/XiangShan](https://github.com/OpenXiangShan/XiangShan)commit为XXXX
[中文文档](Readme_cn.md)
**本验证活动官方为:[www.openverify.cc](https://openverify.cc)**
This project aims to explore open-sourced subdivision verification of the high-performance open-source RISC-V OpenXiangshan processor's microarchitecture. It introduces new tools and methods based on Python, enabling all students interested in chip design and verification to quickly grasp and study the XiangShan microarchitecture. This phase provides a detailed introduction to the principles and implementation of the branch prediction module of the XiangShan Kunminghu architecture, along with the corresponding open-source verification environment. Participants in this phase can earn points and rewards by submitting bugs, writing verification reports, and more.
**gitlink活动地址为gitlink.com/xxx/xxx**
**The Open-Verify Porject Official Website[www.openverify.cc](https://openverify.cc)**
**Gitlink Event[https://www.gitlink.org.cn/glcc/2023/subjects/detail/473](https://www.gitlink.org.cn/glcc/2023/subjects/detail/473)**
## 0x0、安装依赖
除去基本的gcc/python3开发环境外本验仓库还依赖RTL仿真器 Verilator4.218 、Picker工具、MLVP库。具体安装方法请参考以下链接。
1. [Verilator](https://www.veripool.org/projects/verilator/wiki/Installing)
2. [Picker](https://github.com/XS-MLVP/picker)
3. [mlvp](https://github.com/XS-MLVP/mlvp)
通过以下命令安装python依赖
```bash
pip3 install XXXX XXXX XXXX
```
## 0x1、生成待验证模块
下载仓库
```bash
git clone https://github.com/XS-MLVP/env-xs-ov-00-bpu.git
cd env-xs-ov-00-bpu.git
```
### 生成 uFTB
```bash
make uftb TL=python
```
上述命令会在当前目录中生成out目录其中 picker_out_uFTB 目录下的 UT_FauFTB 即为待验证的Python Module。可以在python环境中直接导入。因为待验证的python DUT与python版本相关所以无法提供通用版本的python-dut需要自行编译。
```bash
out
`-- picker_out_uFTB
`-- UT_FauFTB
|-- _UT_FauFTB.so
|-- __init__.py
|-- libDPIFauFTB.a
|-- libUTFauFTB.so
|-- libUT_FauFTB.py
|-- uFTB.fst.hier
`-- xspcomm
|-- __init__.py
|-- __pycache__
| |-- __init__.cpython-38.pyc
| `-- pyxspcomm.cpython-38.pyc
|-- _pyxspcomm.so -> _pyxspcomm.so.0.0.1
|-- _pyxspcomm.so.0.0.1
|-- info.py
`-- pyxspcomm.py
4 directories, 13 files
```
当导入模块UT_FauFTB后可以在Python环境中进行简单测试。
```python
from UT_FauFTB import *
if __name__ == "__main__":
# Create DUT
uftb = DUTFauFTB()
# Init DUT with clock pin name
uftb.init_clock("clock")
# Your testcases here
# ...
# Destroy DUT
utb.finalize()
```
其他待验证模块,例如 TAGE-SCFTB也可以通过类似命令生成。
### Tage SC
```bash
make tage_sc TL=python
```
### FTB
```bash
make ftb TL=python
```
**支持的模块名称有uftb、tage_sc、ftb、ras。也可以通过如下命令一次性生成所有DUT模块。**
```bash
make all TL=python
```
## 0x2、BPU外围环境
BPU是CPU中的一个模块单独无法运行为了对BPU中的子模块进行验证本环境提供了其所需的外围环境来驱动BPU中的各个模块。
### Fake-FTQ
## Introduction
TBD
### 分支Trace
TBD
## 0x3、验证示例
本仓库基于uFTB模块提供了验证示例其中包含了如何编写测试用例、发送激励、定义功能覆盖率、生成测试报告等。
### 编写TestCase
TBD
#### 创建测试函数
本验证环境基于Pytest进行搭建因此如何编写test请参考文档XXXXX。在本示例中编写了如下test
```bash
xxxx/test_xxx.py
```
#### 发送激励
TDB
#### 运行测试
TBD
#### 生成测试报告
在运行
## 0x4、如何参与本活动
参与本验证活动取得名次能够获得丰厚大奖获得地址为XXXX。
### 流程介绍
参与验证的流程如下图所示:
【图】
#### 0报名
TBD
#### 1资格认证
TBD
#### 2fork 本仓库
TBD
#### 3领取任务
TBD
#### 4分解测试点
TBD
#### 5编写测试用例
TBD
#### 6编写测试代码&测试发现bug
TBD
#### 7通过Issue和PR汇报bug获得积分
TBD
#### 8编写测试文档
TBD
#### 9提交测试文档获得最终积分
TBD

74
Readme_cn.md Normal file
View File

@ -0,0 +1,74 @@
# 香山微架构开放验证第一期昆明湖BPU模块UT验证实战
**[English Document](Readme.md)**
本项目的目标是对高性能开源RISC-V香山处理器的微架构进行开放式分包验证的探索。它提供了基于Python的新工具、新方法让所有对芯片设计与验证感兴趣的同学能够快速了解香山微架构学习香山微架构。本期活动对香山昆明湖架构的分支预测模块的原理以及实现进行了详细介绍并提供了对应的开源验证环境。参本次活动的同学通过提交Bug、编写验证报告等获取积分与奖励。
**开源开放验证官网:[www.openverify.cc](https://openverify.cc)**
**gitlink活动地址[https://www.gitlink.org.cn/glcc/2023/subjects/detail/473](https://www.gitlink.org.cn/glcc/2023/subjects/detail/473)**
## 简介
本项目是基于开源工具对开源芯片进行的开源开放验证。本期验证的对象是香山昆明湖微架构中的BPU模块。
### 昆明湖微架构
昆明湖架构是香山开源处理器的第三代高性能微架构,架构图请参考:[昆明湖架构图]()。
### 芯片验证
芯片验证是芯片设计工作中的重点跳过验证或者验证的不够会导致流片失败或者芯片产品不达标带来巨大损失。芯片设计公司把芯片设计当成核心商业机密而芯片验证通常需要基于芯片设计源代码因此芯片验证工作只能在公司内部进行。开源香山高性能risc-v芯片不存在“商业机密泄露”等问题因此可以把芯片验证工作以类似软件分包、众包的方式进行分发让感兴趣的人远程参与。
## 相关文档
1. **[基础学习材料](https://open-verify.cc/mlvp/docs/)**学习什么是芯片验证如何使用Python进行验证。
1. **[香山BPU介绍](https://open-verify.cc/xs-bpu/docs/)**,学习什么是分支预测,香山处理器中采用了哪些基础预测器。
1. **[如何参与本活动](doc/join_cn.md)**,介绍如何参与本活动,有哪些活动规则。
1. **[构建验证环境](doc/env_cn.md)**,介绍基本验证环境搭建,如何进行验证和提交验证结果。
## 本仓库目录
本仓库目录结构和对应说明如下:
```bash
.
├── LICENSE # 开源协议
├── Makefile # 注makefile
├── Readme.md # 英文readme
├── Readme_cn.md # 中文readme
├── doc # 仓库文档
├── image # 文档图片
├── mk # 子makefile
├── out # dut生成目录
└── src # dut源代码
```
**注由于本项目是以PR的方式提交结果所以请务必按照上述目录要求进行数据组织**
## 加入讨论群
为了防止群内广告泛滥请运行以下Python代码获取群号:
QQ群
```python
import base64
base64.b64decode('Your_Base64_Data_Here').decode()
```
微信群
```python
import base64
from io import BytesIO
from PIL import Image
base64_image_data = \
"Your_Base64_Image_Data_Here_0"\
"Your_Base64_Image_Data_Here_1"
image_data = base64.b64decode(base64_image_data)
image = Image.open(BytesIO(image_data))
image.show()
```

136
doc/env_cn.md Normal file
View File

@ -0,0 +1,136 @@
# BPU验证环境
本环境提供BPU验证所需的所有依赖以及工具包。本验证环境需要在linux系统下运行它包含了如何生成带验证的Python DUT模块、验证示例、验证报告生成等模块。待验证模块对应的香山仓库为[github.com/OpenXiangShan/XiangShan](https://github.com/OpenXiangShan/XiangShan/tree/kunminghu)commit为[ea2f767c24941b08d375b2b9529cd11b5850960a](https://github.com/OpenXiangShan/XiangShan/tree/ea2f767c24941b08d375b2b9529cd11b5850960a)
## 安装依赖
除去基本的gcc/python3开发环境外本验仓库还依赖RTL仿真器 Verilator4.218 、Picker工具、MLVP库。具体安装方法请参考以下链接。
1. [Verilator](https://www.veripool.org/projects/verilator/wiki/Installing)
2. [Picker](https://github.com/XS-MLVP/picker)
3. [mlvp](https://github.com/XS-MLVP/mlvp)
通过以下命令安装python依赖
```bash
pip3 install XXXX XXXX XXXX
```
## 生成待验证模块
下载仓库
```bash
git clone https://github.com/XS-MLVP/env-xs-ov-00-bpu.git
cd env-xs-ov-00-bpu.git
```
### 生成 uFTB
```bash
make uftb TL=python
```
上述命令会在当前目录中生成out目录其中 picker_out_uFTB 目录下的 UT_FauFTB 即为待验证的Python Module。可以在python环境中直接导入。因为待验证的python DUT与python版本相关所以无法提供通用版本的python-dut需要自行编译。
```bash
out
`-- picker_out_uFTB
`-- UT_FauFTB
|-- _UT_FauFTB.so
|-- __init__.py
|-- libDPIFauFTB.a
|-- libUTFauFTB.so
|-- libUT_FauFTB.py
|-- uFTB.fst.hier
`-- xspcomm
|-- __init__.py
|-- __pycache__
| |-- __init__.cpython-38.pyc
| `-- pyxspcomm.cpython-38.pyc
|-- _pyxspcomm.so -> _pyxspcomm.so.0.0.1
|-- _pyxspcomm.so.0.0.1
|-- info.py
`-- pyxspcomm.py
4 directories, 13 files
```
当导入模块UT_FauFTB后可以在Python环境中进行简单测试。
```python
from UT_FauFTB import *
if __name__ == "__main__":
# Create DUT
uftb = DUTFauFTB()
# Init DUT with clock pin name
uftb.init_clock("clock")
# Your testcases here
# ...
# Destroy DUT
utb.finalize()
```
其他待验证模块,例如 TAGE-SCFTB也可以通过类似命令生成。
### Tage SC
```bash
make tage_sc TL=python
```
### FTB
```bash
make ftb TL=python
```
**支持的模块名称有uftb、tage_sc、ftb、ras。也可以通过如下命令一次性生成所有DUT模块。**
```bash
make all TL=python
```
## BPU外围环境
BPU是CPU中的一个模块单独无法运行为了对BPU中的子模块进行验证本环境提供了其所需的外围环境来驱动BPU中的各个模块。
### Fake-FTQ
TBD
### 分支Trace
TBD
## 验证示例
本仓库基于uFTB模块提供了验证示例其中包含了如何编写测试用例、发送激励、定义功能覆盖率、生成测试报告等。
### 编写TestCase
TBD
#### 创建测试函数
本验证环境基于Pytest进行搭建因此如何编写test请参考文档XXXXX。在本示例中编写了如下test
```bash
xxxx/test_xxx.py
```
#### 发送激励
TDB
#### 运行测试
TBD
#### 生成测试报告
TBD

73
doc/join_cn.md Normal file
View File

@ -0,0 +1,73 @@
## 如何参与本活动
参与本验证活动取得名次能够获得丰厚大奖报名地址www.TBDTBD.com
### 流程介绍
参与验证的流程如下图所示:
<img src="../image/ov-pipline.svg" width="800px">
#### 0在线报名
参加本活动的队伍队员数没有限制,可以是一个也可以是多个。最终奖金按队伍积分发放给队长,且在活动开放期间,队名和队长的名称会被群内公开。
#### 1资格认证
为了对参赛队伍进行能力评估本活动提供了数个具有已知bug的DUT让参加队伍进行验证测试能发现其中的80%以上的bug并能进行原因分析的队伍才能获得获得参加资格。其中发现的bug数也会变成对应的队伍积分。
#### 2Fork仓库
Fork本仓库然后在本地进行环境搭建参与测试任务。
#### 3领取任务
任务在本仓库Issue中进行描述队长以Issue的方式在Issue下方进行报名。管理员会进行统计然后群内发布公告。
#### 4分解测试点与编写验证方案
测试点分解和验证方案是芯片验证过程中的重要步骤直接影响验证结果。在本阶段需要通过PR提交对应报告组织方会对报告进行评审和打分。
#### 5编写测试用例
测试用例编写具体格式可以参考模板XXXX。测试用例需要覆盖到对应的测试点。
#### 6编写测试代码&测试发现bug
测试过程中发现bug后需要对bug进行分析。
#### 7通过Issue和PR汇报bug获得积分
可以通过PR随时进行bug提交但是一天组织方只对一个队伍进行一次bug审查。组织方根据bug类型等级发放对应积分。
#### 8编写测试文档
参考模板XXX进行对应文档编写。
#### 9PPT在线答辩
编写PPT在线进行对整个验证任务的答辩。答辩根据给队伍的完成情况集中组织。
## PR提交基本要求
覆盖率要求:
1. 代码行覆盖率需要大于 95%
1. 功能覆盖率必要达到 100%
1. 覆盖率有验证环境运行得到,不可对报告和生成罗辑进行修改
文档要求:
1. 对功能点进行合理的测试点分解。功能点可以自行增加,但不能对原始功能点进行删除。
1. 设计的测试用例必要覆盖所有测试点和功能点
1. 请按模板XXX进行编写测试文档
1. 领取多个验证任务后,其验证报告需要分开写
积分获取方式:
1. 合理的测点分解、合理的验证方案、规范的验证文档
1. 验出bug并分析出bug原因按bug确认等级获取积分
1. 修复本项目中文档,代码中出现的错误,按错误等级获取积分
1. 提交最终验证报告,按报告质量,覆盖率获得积分
1. 最终汇报得分

105
image/ov-pipline.drawio Normal file
View File

@ -0,0 +1,105 @@
<mxfile host="app.diagrams.net" modified="2024-04-11T06:42:17.627Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0" etag="6yX-ULCYsPwj42ocDWqh" version="24.0.7" type="device">
<diagram name="Page-1" id="FTH7PsahlGnXAK5tEtyi">
<mxGraphModel dx="843" dy="512" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="NuuIC_HhkidKEVra6tKi-31" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="60" y="230" width="630" height="150" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-1" value="在线报名" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="80" y="30" width="20" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-2" value="资格认证" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="140" y="30" width="20" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-3" value="F&lt;div&gt;o&lt;/div&gt;&lt;div&gt;r&lt;/div&gt;&lt;div&gt;k&lt;/div&gt;&lt;div&gt;仓库&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="200" y="30" width="20" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-20" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-4" target="NuuIC_HhkidKEVra6tKi-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-4" value="领取任务" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="250" y="30" width="20" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-21" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-6" target="NuuIC_HhkidKEVra6tKi-8">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-6" value="测试点分解&amp;amp;验证方案" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="310" y="30" width="30" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-7" value="编写&lt;div&gt;&amp;amp;测试测用例&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="370" y="30" width="30" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-22" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-8" target="NuuIC_HhkidKEVra6tKi-9">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-8" target="NuuIC_HhkidKEVra6tKi-4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-8" target="NuuIC_HhkidKEVra6tKi-7">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="440" y="150" />
<mxPoint x="385" y="150" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-8" value="b&lt;div&gt;u&lt;/div&gt;&lt;div&gt;g汇报&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="430" y="30" width="20" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-23" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-9" target="NuuIC_HhkidKEVra6tKi-10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-9" value="测试文档撰写" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="480" y="30" width="20" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-26" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-10" target="NuuIC_HhkidKEVra6tKi-25">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-10" value="P&lt;div&gt;P&lt;/div&gt;&lt;div&gt;T在线答辩&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="530" y="30" width="20" height="100" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-12" value="每个队伍、每个阶段的基本数据(阶段、任务、积分)相互公开" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="80" width="470" height="20" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-13" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="30" y="79.70999999999998" as="sourcePoint" />
<mxPoint x="70" y="79.70999999999998" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-14" value="队伍" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry y="50" width="20" height="50" as="geometry" />
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-15" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="100" y="79.70999999999998" as="sourcePoint" />
<mxPoint x="140" y="79.70999999999998" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-16" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-2" target="NuuIC_HhkidKEVra6tKi-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="110" y="89.70999999999998" as="sourcePoint" />
<mxPoint x="150" y="89.70999999999998" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-17" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" target="NuuIC_HhkidKEVra6tKi-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="220" y="79.70999999999998" as="sourcePoint" />
<mxPoint x="250" y="80" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-18" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="NuuIC_HhkidKEVra6tKi-31" source="NuuIC_HhkidKEVra6tKi-4" target="NuuIC_HhkidKEVra6tKi-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="79.70999999999998" as="sourcePoint" />
<mxPoint x="300" y="80" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="NuuIC_HhkidKEVra6tKi-25" value="结束&lt;div&gt;结算&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="NuuIC_HhkidKEVra6tKi-31">
<mxGeometry x="590" y="60" width="40" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

4
image/ov-pipline.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 29 KiB