Dear Tunars,

晚上好! “开源软件供应链点亮计划——暑期2024” <https://summer-ospp.ac.cn> 目前项目开发时间已经过半。今年 TUNA 
共立项四个项目 <https://tuna.moe/blog/2024/ospp-summer-2024/> 
(https://tuna.moe/blog/2024/ospp-summer-2024/),开发正在有序进行中。我们邀请了各位学员和导师简要介绍各自项目目前的进展,欢迎各位感兴趣的朋友们一同交流。
 


查看简报的网页版本:https://tuna.moe/blog/2024/ospp-summer-2024-midterm/

---

*Rust 基于完成的异步 QUIC*

Asakura Mizu <asakuramizu...@gmail.com> / Berrysoft 
<https://github.com/Berrysoft> 

*目前完成的工作* 

经过最初的一段时间调研后,最终选择在 quinn-proto 的基础上,对 quinn-udp 和 quinn 的功能进行移植。

没曾想,在实际开发过程中,移植 quinn-udp 的”可选”功能反而花费了更长的时间,因为需要把 quinn-udp 中直接调用 syscall 
实现的 socket 操作封装为“基于完成的异步”的形式并移植到 io-uring 和 iocp 上。

quinn 的移植则相对容易一些,主要就是去除对 tokio 的依赖以及把与 quinn-udp 的交互修改为与自己封装的 socket 交互。

目前已基本完成了 quinn 的大部分功能的移植,一些额外功能如统计数据、work limiter 等则暂时没有计划。不过目前 benchmark 
结果表现略逊于 quinn,推测可能是 quinn-udp 使用了 recvmmsg 批量接收消息的原因,不过还需进一步确认。
*之后的工作* 

目前计划先完善当前的工作,进行 review 并 merge 到主分支上。接下来计划移植 h3-quinn 的功能(这东西代码才几百行),也许可以用 
quic-interop-runner 进行一下测试。

---

*CIRCT 编译器的电路划分及 Arcilator 仿真并行化* 

Asuna <https://github.com/SpriteOvO> / 喵喵 <xiaoyi....@tuna.tsinghua.edu.cn>

目前已在 Fork 仓库中向 CIRCT 添加了一个 Partition Pass。我们计划在 HW Dialect 层对电路模块进行划分,这样 
Lower 到 Arc Dialect 层之前就是已经划分好的电路模块。

Partition Pass 已经做了初步实现,现在可以对简单带状态的单层模块进行不完全自动(需手动指定 reg 分配到哪个子模块中)划分,划分效果 
MLIR 例子见原文 (https://tuna.moe/blog/2024/ospp-summer-2024-midterm/)

现在的策略是每个 output 划分成一个单独的子模块。下一步计划着手处理带 instance 
的嵌套模块切分,在切这样的模块时尽力避免跨模块边界过多的连线。之后我们计划对模块进行图建模,然后引入 METIS 库来对图进行划分,并由该库来决定 
reg 状态分配到哪个子模块中。在实现完这些后向上游仓库打开 PR 并推动合并。

---

*RISC-V 向量处理器 T1 性能评估框架* 

范书沛 <dymark...@outlook.com> / Sequencer <https://github.com/sequencer>

*Profiler 实现* 

Profiler 使用 rust 语言实现。目前已完成 T1 profiler 的多个基本模块编写,并将已编写完成的模块组合得到了一个分析器 DEMO。
*Event 日志读取* 

仿真得到的 Event Log 原始输出为 jsonl 文件,每行为一个 json 对象,描述了一个事件及其时间戳。 
由于原始输出的体积庞大,仿真管线会将原始事件日志经 zstd 压缩之后存储。Profiler 利用了 zstd crate 
可以直接读取压缩之后的日志文件。事件解析部分,利用 serde 库将 Json 编码的事件直接读取为 Rust 中定义的结构体。
*日志筛选与重排序* 

事件会按事件顺序给出,但由于 Chisel 语言的限制,同一时钟周期内发生的事件记录顺序难以事先确定。同时 Profiler 
在执行特定的分析任务时可能只需要部分类型的事件。在处理事件之前,会先将事件进行过滤,筛选出感兴趣的事件,并对同一周期内记录的事件进行重排序。
*事件分析波形输出* 

为了更精细的分析 Profiler 得到的结果,RTL 设计人员希望能将部分较为细节的分析结果与仿真波形对齐,希望 Profiler 
能以波形文件的方式部分低层次的分析结果。

目前 Profiler 以 FST 格式输出分析波形文件。本项目将 FST C-API 进行了简单的包装已完成 FST 格式输出功能。已可以输出 
hierarchy 定义,记录下 int/bits 和 string 类型信号的波形,本部分功能基本完备。
*未来计划* 

性能分析的方法学部分已有初步设计,但尚未完成所有细节。 后续计划主要完善性能分析的方法学后,与 RTL 设计人员沟通,添加相应的 event 
log,并编写性能分析的代码。

除了核心功能开发外,还有以下非核心功能。若时间充裕,也考虑进行开发。
*设计参数传递* 

T1 支持参数化的生成多种不同配置的加速器,但目前仿真器产生的日志文件不包含配置信息,profiler 难以获得设计参数。目前阶段暂时在 
profiler 硬编码设计参数。后续考虑与仿真器部分统一接口。
波形查看器扩展 

Profiler 输出的事件分析波形需要与仿真波形一起打开进行查看。目前使用 GtkWave 的 twinwave 
程序可以打开两个并列且滚动同步的窗口,但使用并不方便。

目前开源的波形查看软件 GtkWave 和 Surfer 均缺乏同时打开多个波形文件,将其聚合显示在同一窗口的功能(该功能在对应的仓库均有 
Feature Request,但由于社区开发力量不足,暂无实质的开发进展)。未来考虑参与到 GtkWave 或 Surfer 
社区的多波形文件查看功能的开发之中。
*事件波形输出格式* 

目前事件波形以 FST 格式输出,未来会增加 VCD 格式输出的功能。由于 VCD 格式是较为简单的文本格式,。目前的 Profiler 
代码中已对事件波形输出部分设计了相应的接口。添加该功能不需要大的架构改动。
*运行分析器* 

运行程序
t1-profiler --wave-path analysis.fst event-log.jsonl.zstd 

查看分析结果
twinwave analysis.fst + wave.fst

---

*基于前端技术栈的 OpenStreetMap 中公共交通关系编辑器* 

fltb <https://github.com/fltb> / 快乐的老鼠宝宝 <https://github.com/laoshubaby>

不知不觉一个多月过去了,我们也已经在官网上刊登了两次双周报。以下是对目前工作的一部分总结和一些暂时尚未写在报告中的进展。
*项目进展* 

项目仍处于早期开发阶段,我们基本确定了渲染部分的实现方式。经过测试,点和路径已经可以成功渲染,但对于复合多边形仍有一些工作需要完成。
*代码结构* 

我们计划将项目划分为不同的组件 
<https://github.com/fltb/BusFensi/commit/706886d05d21b205f19bf865ffb981230ee177ab>
,以便未来的开发和维护。

[image: 组件和代码结构在提交中的展示]
*功能*

*编辑器的API请求* 

由于缺少足够简洁的OSM API封装,我开发了一个 OSM API 模块,使用 Promises 封装了 OSM 的一些接口,能够与符合 OSM 
标准的 API 进行通信并提交结果,同时将返回的 XML 解析为 JavaScript 对象,以便在程序中更容易操作。
*渲染与可视化* 

目前,我们的代码无法执行任何编辑操作,虽然能从 OSM 网站获取 XML 或 JSON 
数据,但尚不能直接渲染。因此,我手动构建了几个点作为非常基础的渲染测试。(请原谅配色方案的粗糙,我会在后续进行优化。)

背景瓦片功能也进行了测试,目前运行良好。

由于地球上71%的面积是海洋,大部分陆地无人居住,而我不幸随机选择了一个位于荒野中的位置,因此在这张截图里没能展示出可识别的 OSM 
数据。不过瓦片确实可以正常请求和渲染,正如截图中的开发者工具所示。

[image: 瓦片的网络请求统计]

此外,我们在尝试为所有瓦片请求添加自定义 User-Agent 以遵守 OSMF 
的瓦片使用政策时遇到了一个小技术问题。具体来说,我们希望自定义请求头部(例如,在 User-Agent 中插入 Mozilla/5.0 
(Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 
BusFensi/0.0.1 之类的信息,而不是使用浏览器的默认 User-Agent)。我们需要对 pixi.js 进行一些修改,因为 
pixi.js 似乎通过 <img> 标签加载图片。然而,这样做不符合良好的开发实践。因此,根据 @bhousel 的建议 
<https://osmus.slack.com/archives/C1VE7JM9T/p1721227063592989>
,我们决定放弃这个相对不重要的需求。

目前,数据渲染部分已经设置完毕,不过仍有一些细节需要打磨,比如样式和控制渲染的元素。这些将在后续功能开发中同步调整,以确保样式与编辑逻辑一致。

[image: 显示效果]

(糟糕,确实看起来不太美观)

不过,只需几行代码,我就可以移除建筑物(以及其他非公路特征)的渲染,这将使其看起来好得多。我会逐步调整样式——也许借鉴一些 iD 编辑器的颜色?

至于编辑功能,现在无法进行演示,因为目前只有拖动点、平移地图和调整缩放级别的功能。

由于其他模块的接口仍在开发中,一些功能尚未实现。例如,路径的高亮显示,目前默认逻辑是选择整个路径,而不是高亮显示路径的某一段。再比如,多边形的渲染还没有实现,因为这需要编辑模块的接口。
*编辑器的状态管理* 

目前,正在编写状态管理模块,为编辑提供稳定支持。这部分主要包括操作逻辑和全局数据管理。

在地图编辑的操作逻辑中,我引入了一个状态机,通过监听鼠标和键盘事件来管理编辑器的当前状态。状态机在代码中被称为“stateMachine.js”,它根据状态图中提供的功能和状态关系,处理状态转换和数据维护。根据当前状态,它决定触发哪
 
些操作以及要转换到的新状态。状态机提供了钩子,允许其他组件(如 Pixi.js 中的鼠标事件)跟踪事件。编辑操作在状态转换期间进行。

一般来说,在状态机的状态转换过程中,会对全局数据进行一系列更改。为了管理这些更改,代码中使用了一个双向链表,称为“操作列表”。该列表提供撤销、重做和执行接口。执行接口接受一个操作,执行它,然后将其添加到列表的末尾。为了避免多个重复操作,某些操作会被合并。

一个操作提供执行、撤销和重做接口,有些操作还提供合并选项。操作在执行、撤销或重做时应维护全局数据,并管理其他相关更改,例如受影响元素的 UI 
和跨层的数据。这种方法确保所有更改都集中在一起,最大限度地减少在撤销和重做操作期间维护相关更改的认知负担。

全局数据是每个操作中引用的对象,操作列表确保在撤销和重做操作期间,操作的顺序是正确的。例如,它确保在撤销一个操作时,状态反映所有后续操作已经被撤销。

由于实际的编辑操作尚未完成,撤销和重做功能暂时未考虑,因为它们依赖于仍在进行中的部分代码。

[image: 状态管理的 Mermaid 图]
*维护路线图* 

项目的核心模块现已基本完成,这使我们能够进入开发的后期阶段。接下来的工作主要是在现有框架内添加新功能。

项目已经开发了大约一个半月,截止日期在九月底,时间相对紧张。因此,我将优先完成核心功能,将一些非核心功能推迟到以后完成,以确保项目顺利完成。

以下是需要实现的主要功能:
*UI 组件* 
   
   - *大纲视图*:显示所有当前元素,允许选择和基本的元素状态管理。
   - *属性视图*:管理各种属性,包括全局设置和当前选定元素的元数据。
   - 一些独立组件,如创建新节点、连接线段等。

请注意,UI 的实现可能会被推迟,因为优先考虑开发基本图形模块。
*功能方面* 

作为一个公共交通编辑器,它应支持公共交通编辑功能。在 OSM XML 
中,公共交通关系由一个关系元素表示,该元素有一个路线和一系列标签,指示该元素的具体内容。

对于元数据的编辑,可以使用前面提到的属性视图。

对于点的精确位置编辑,将使用地图模块。我考虑添加一些样式以突出当前正在编辑的路线,使其更容易识别。

对于路线、点和路径之间的成员关系,需要将地图的选择功能与属性视图集成。

此外,可能需要一个路线创建功能,包括添加新点、创建新路线和编辑路线属性。

为了基于站点关系实现路线计算,利用现有的 API 如 Valhalla 或 OSRM 可以非常有效,因为它们本身就是基于 OSM 
的模型来设计数据读取的。

-- 
您收到此邮件是因为您订阅了 Google 群组的“TUNA 主邮件列表”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到tuna-general+unsubscr...@googlegroups.com。
要在网络上查看此讨论,请访问 
https://groups.google.com/d/msgid/tuna-general/0f73c22b-a8fa-48e7-80c2-8fe4b6e45920n%40googlegroups.com。

回复